$boundary = md5(time());
$postStr = "";
$postStr .="--".$boundary."\r\n";
$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"\r\n";
$postStr .="Content-Type: text/html\r\n\r\n";
$postStr .=$uploadFile."\r\n"; #这里是部分文件内容
$postStr .="--".$boundary."\r\n";
$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"\r\n";
$postStr .="Content-Type: text/html\r\n\r\n";改为$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\""; //删除\r\n
$postStr .="Content-Type: text/html"; //删除\r\n之后还是可以上传成功
而且$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"\r\n";
$postStr .="Content-Type: text/html\r\n\r\n";改为$postStr .='Content-Disposition: form-data; name="uptxt[]"; filename="index_1.html"\r\n';//改为单引号,\r\n不再转义
$postStr .='Content-Type: text/html\r\n\r\n'; //改为单引号,\r\n不再转义也可以上传成功,求解
你能请求成功,但是会让web服务器解析http时乱套,/号和换行符都是重要的符号标志。比方说现在boundary块如下,注意Content-type:text~html,去除\r\n且把/换成~
$boundary = md5(time());
$postStr = "";
$postStr .="--".$boundary."\r\n";
$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"";
$postStr .="Content-Type: text~html";
$postStr .="123\r\n"; #这里是部分文件内容
$postStr .="--".$boundary."\r\n";那么你猜服务器怎么解析的?
它找到第一个出现\r\n\r\n结束的位置,以找到文件名,如果没有就一直解析到尾
所以$_FILES结果变成了
Array
(
[uptxt] => Array
(
[name] => Array
(
[0] => index_1.html"Content-Type: text~html123--91805707cf4d3a1cf19b6c42446b66a4
) [type] => Array
(
[0] =>
) [tmp_name] => Array
(
[0] =>
) [error] => Array
(
[0] => 3
) [size] => Array
(
[0] => 0
) ))
boundary串都作为文件名一部分了,所以我们预想的提交的文件内容也没解析到。
你说你那边居然可以,就有点出乎意料了,我也搞不懂了,不管如何,按照协议规范来构建http请求就好了。
$url = 'http://www.myheritage.cn/FP/Company/tryFaceRecognition.php';//target url
$fields['file'] = '@'.'C:\Users\lzyy\Desktop\3431821560_5e18c02221.jpg';
$fields['lang'] = 'ZH';
$fields['morph'] = '1';
$fields['popup'] = 'PJSLVMMT';
$fields['loadMethod'] = 'myFiles';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields );
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_REFERER, "http://www.myheritage.cn/");
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//get redirect content
curl_exec( $ch );
//$rs = curl_exec($ch);
if ($error = curl_error($ch) ) {
die($error);
}
curl_close($ch);
//print_r(htmlspecialchars($rs));
echo 'ok';
?>http://snipplr.com/view/13990/curl/http://www.baidu.com/s?wd=curl+upload+file&rsv_bp=0&rsv_spt=3&inputT=4344