使用html格式从服务器到服务器的http传输文件

问题描述:

我们可以使用enctype =“multipart/form-data”,输入类型=“文件”等将客户端上传到服务器的文件。使用html格式从服务器到服务器的http传输文件

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

感谢提示。

//哇!这是我见过的最快的问题解答页面!例如:

当浏览器上传文件到服务器时,它发送一个HTTP POST请求,其中包含文件的内容。

您将有te复制。


使用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_exec返回结果,而不是将它输出
  • 使用POST,而不是GET
  • 张贴一些数据,包括文件 - 注意文件的路径前@
+0

我认为这是行得通的,我会试试这个!谢谢:-) (嘿,你有相同的姓氏,那么我所以你的回答必须是正确的^^) – qualle 2010-04-05 11:49:28

+0

不客气:-)玩得开心! *(很多人用我们的名字,我看到^^)* – 2010-04-05 11:50:59

+0

+1,我没有意识到它和使用PHP的'@'符号一样简单:-) – 2010-04-05 11:58:00

Ex。如果服务器A上有一个名为mypicture.gif的文件,并且想将它发送给服务器B,则可以使用CURL。

  1. 服务器A以字符串形式读取内容。
  2. 后的卷曲度到服务器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); 
?> 

如果服务器都在您的控制之下,FTP可能是比HTTP更好的选择。

+0

不幸的是,不是 – qualle 2010-04-05 11:46:10

+0

FTP并不是一个好的选择,因为遍历防火墙和NAT网关很麻烦。坚持使用HTTP,甚至更好地使用HTTPS。先进的解决方案也考虑到webdav,但永远不要FTP! – Raven 2010-04-05 11:48:40

+0

如果两台服务器都在asker的控制之下(就像我在答案中所说的那样),我不明白防火墙是怎么样的问题? – 2010-04-05 12:10:41

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

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

<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