http передают файл с сервера на сервер

с формами HTML мы можем загрузить файл от клиента к серверу с enctype="multipart/form-data", вход type="file" и так далее.

Существует ли способ уже иметь файл НА сервере и передать его другому серверу тот же путь?

Спасибо за подсказки.

//WoW! Это - самая быстрая страница ответа вопроса, которую я когда-либо видел!!

9
задан Mayank Pandeyz 18 July 2018 в 09:25
поделиться

3 ответа

Когда браузер загружает файл на сервер, он отправляет HTTP-запрос POST, содержащий содержимое файла.

Вам придется повторить это.


С PHP самым простым (или, по крайней мере, наиболее часто используемым) решением , вероятно, является работа с curl .

Если вы посмотрите на список параметров, которые вы можете установить с помощью curl_setopt , то увидите этот: CURLOPT_POSTFIELDS (цитата) :

полные данные для публикации в операции HTTP "POST" .
Чтобы опубликовать файл, добавьте к имени файла @ и используйте полный путь .
Это может быть либо передано как строка с URL-кодом, например 'para1 = val1 & para2 = val2 & ...', либо как массив с именем поля в качестве ключа и { {1}} данные поля как значение.
Если значением является массив, заголовок Content-Type будет установлен на multipart / form-data.


Не тестировалось, но я полагаю, что что-то вроде этого должно помочь - или, по крайней мере,
поможет вам начать работу:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/your-destination-script.php");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
        'file' => '@/..../file.jpg',
         // you'll have to change the name, here, I suppose
         // some other fields ?
));
$result = curl_exec($ch);
curl_close($ch);

По сути, вы:

  • используете curl
  • должны установить целевой URL
  • указывает, что вы хотите, чтобы curl_exec возвращал результат, а не выводил его.
  • используют POST , а не GET
  • отправляют некоторые данные , включая файл - обратите внимание на @ перед путем к файлу.
11
ответ дан 4 December 2019 в 14:27
поделиться

вы можете сделать это точно так же. На этот раз ваш сервер, который первым получил файл, является клиентом, а второй сервер - вашим сервером. Попробуйте использовать эти:

Для веб-страницы на втором сервере:

  <form>
         <input type="text" name="var1" />
         <input type="text" name="var2" />
         <input type="file" name="inputname" />
         <input type="submit" />
  </form>

И в качестве сценария для отправки файла на первый сервер:

<?php
function PostToHost($host, $port, $path, $postdata, $filedata) {
     $data = "";
     $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
     $fp = fsockopen($host, $port);

     fputs($fp, "POST $path HTTP/1.0\n");
     fputs($fp, "Host: $host\n");
     fputs($fp, "Content-type: multipart/form-data; boundary=".$boundary."\n");

     // Ab dieser Stelle sammeln wir erstmal alle Daten in einem String
     // Sammeln der POST Daten
     foreach($postdata as $key => $val){
         $data .= "--$boundary\n";
         $data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n";
     }
     $data .= "--$boundary\n";

     // Sammeln der FILE Daten
     $data .= "Content-Disposition: form-data; name=\"{$filedata[0]}\"; filename=\"{$filedata[1]}\"\n";
     $data .= "Content-Type: image/jpeg\n";
     $data .= "Content-Transfer-Encoding: binary\n\n";
     $data .= $filedata[2]."\n";
     $data .= "--$boundary--\n";

     // Senden aller Informationen
     fputs($fp, "Content-length: ".strlen($data)."\n\n");
     fputs($fp, $data);

     // Auslesen der Antwort
     while(!feof($fp)) {
         $res .= fread($fp, 1);
     }
     fclose($fp);

     return $res;
}

$postdata = array('var1'=>'test', 'var2'=>'test');
$data = file_get_contents('Signatur.jpg');
$filedata = array('inputname', 'filename.jpg', $data);

echo PostToHost ("localhost", 80, "/test3.php", $postdata, $filedata);
?>

Оба сценария взяты отсюда: http : //www.coder-wiki.de/HowTos/PHP-POST-Request-Datei

3
ответ дан 4 December 2019 в 14:27
поделиться

Пр. если у вас есть файл mypicture.gif на сервере A и вы хотите отправить его на сервер B, вы можете использовать CURL.

  1. Сервер A считывает содержимое как строку.
  2. Отправьте строку с CURL на сервер B
  3. Сервер B извлекает строку и сохраняет ее в виде файла с именем mypictyre-copy.gif

См. http://php.net/manual/en/ book.curl.php

Пример кода PHP:

<?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
    curl_setopt($ch, CURLOPT_URL, _VIRUS_SCAN_URL);
    curl_setopt($ch, CURLOPT_POST, true);
    // same as <input type="file" name="file_box">
    $post = array(
        "file_box"=>"@/path/to/myfile.jpg",
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    $response = curl_exec($ch);
?>
0
ответ дан 4 December 2019 в 14:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: