使用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
- 张贴一些数据,包括文件 - 注意文件的路径前
@
。
Ex。如果服务器A上有一个名为mypicture.gif的文件,并且想将它发送给服务器B,则可以使用CURL。
- 服务器A以字符串形式读取内容。
- 后的卷曲度到服务器B
- 服务器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);
?>
你可以用同样的方法做到这一点。就在这时,您首先收到文件的服务器就是客户端,而第二台服务器就是您的服务器。 尝试使用这些:
对于第二个服务器上的网页:
<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
我认为这是行得通的,我会试试这个!谢谢:-) (嘿,你有相同的姓氏,那么我所以你的回答必须是正确的^^) – qualle 2010-04-05 11:49:28
不客气:-)玩得开心! *(很多人用我们的名字,我看到^^)* – 2010-04-05 11:50:59
+1,我没有意识到它和使用PHP的'@'符号一样简单:-) – 2010-04-05 11:58:00