从服务器到服务器的http传输文件

时间:2010-04-05 11:37:25

标签: php html file-upload

使用html表单我们可以将文件从客户端上传到服务器enctype="multipart/form-data",输入type="file"等等。

有没有办法让文件已经在服务器上并以同样的方式传输到另一台服务器?

感谢提示。

//魔兽!这是我见过的最快的问答页面!!

6 个答案:

答案 0 :(得分:11)

当浏览器将文件上传到服务器时,它会发送一个包含文件内容的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
  • 必须设置目标网址
  • 表示您希望curl_exec返回结果,而不是输出结果
  • 正在使用POST,而不是GET
  • 发布一些数据,包括文件 - 请注意文件路径前的@

答案 1 :(得分:3)

你可以用同样的方式做到这一点。就在这次,首先收到文件的服务器是客户端,第二台服务器是您的服务器。 尝试使用这些:

对于第二台服务器上的网页:

  <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

答案 2 :(得分:0)

实施例。如果您在服务器A上有一个名为mypicture.gif的文件,并希望将其发送到服务器B,则可以使用CURL。

  1. 服务器A将内容读取为字符串。
  2. 将带有CURL的字符串发布到服务器B
  3. 服务器B获取String并将其存储为名为mypictyre-copy.gif
  4. 的文件

    请参阅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);
    ?>
    

答案 3 :(得分:0)

这是我在将大文件从服务器移动到服务器时经常使用的简单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!';

答案 4 :(得分:0)

将文件从一台服务器转移到另一台服务器的最简单方法。

首先,需要启用 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);
         }

答案 5 :(得分:0)

非常简单。这是非常简单的代码

<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>


在此变量中输入您的网址-$file ="http://file-url"

键入文件另存为托管服务器-$dest = 'files.jpg';