http передача файла с сервера на сервер - PullRequest
9 голосов
/ 05 апреля 2010

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

Есть ли способ получить файл уже на сервере и перенести его на другой сервер таким же образом?

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

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

Ответы [ 6 ]

11 голосов
/ 05 апреля 2010

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

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


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

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

полные данные для публикации в HTTP "POST" операция.
Чтобы опубликовать файл, добавьте @ к имени файла и используйте полный путь .
Это может быть передается в виде строки, закодированной как urlencoded 'para1 = val1 & para2 = val2 & ...' или как массив с именем поля в качестве ключа и данные поля как значение.
Если значение массив, заголовок 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
  • публикует некоторые данные, включая файл - запишите @ перед путем к файлу.
3 голосов
/ 05 апреля 2010

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

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

  <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

0 голосов
/ 29 декабря 2018

Это очень просто. Это очень простой и простой код

<html>
<body>

<?php
/*the following 2 lines are not mandatory but we keep it to 
avoid risk of exceeding default execution time and mamory*/
ini_set('max_execution_time', 0);
ini_set('memory_limit', '2048M');

/*url of zipped file at old server*/
$file = 'http://i.ytimg.com/vi/Xp0DOC6nW4E/maxresdefault.jpg';

/*what should it name at new server*/
$dest = 'files.jpg';

/*get file contents and create same file here at new server*/
$data = file_get_contents($file);
$handle = fopen($dest,"wb");
fwrite($handle, $data);
fclose($handle);
echo 'Copied Successfully.';
?>

</body>
</html>


Введите свой URL в этой переменной - $file ="http://file-url"

Введите файл сохранить как на хостинге сервер- $dest = 'files.jpg';

0 голосов
/ 28 декабря 2018

Самый простой способ перенести файл с одного сервера на другой сервер.

Во-первых, необходимо включить расширение ssh2 php и использовать следующий код

$strServer = '*.*.*.*';
$strServerPort = '*';
$strServerUsername = '*****';
$strServerPassword = '****';

**//connect to server**
$resConnection = ssh2_connect($strServer, $strServerPort);
         if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword))
         {
            //Initialize SFTP subsystem            
         $resSFTP = ssh2_sftp($resConnection);             
         $resFile = fopen("ssh2.sftp://{$resSFTP}/FilePath/".$filename, 'w');
         $srcFile = fopen($path.$filename, 'r');
         $writtenBytes = stream_copy_to_stream($srcFile, $resFile);
         fclose($resFile);
         fclose($srcFile);
         }
0 голосов
/ 26 мая 2018

Это простой PHP-скрипт, который я часто использую при перемещении больших файлов с сервера на сервер.

set_time_limit(0); //Unlimited max execution time

$path = 'newfile.zip';
$url = 'http://example.com/oldfile.zip';
$newfname = $path;
echo 'Starting Download!<br>';
$file = fopen ($url, "rb");
if($file) {
    $newf = fopen ($newfname, "wb");
    if($newf)
        while(!feof($file)) {
            fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
            echo '1 MB File Chunk Written!<br>';
        }
}
if($file) {
    fclose($file);
}
if($newf) {
    fclose($newf);
}
echo 'Finished!';
0 голосов
/ 05 апреля 2010

Ex.если у вас есть файл 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);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...