200分求助CURL设置HTTPHEADER上传文件问题!(补充提问)

skyaspnet 2012-04-10 06:46:40

$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不再转义

也可以上传成功,求解
...全文
185 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyaspnet 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

引用 2 楼 的回复:

协议就是要来遵守的,如果不遵守,后果的不可预知的。
你能请求成功,但是会让web服务器解析http时乱套,/号和换行符都是重要的符号标志。

比方说现在boundary块如下,注意Content-type:text~html,去除\r\n且把/换成~
PHP code
$boundary = md5(time());
……
[/Quote]

确实比较诡异,还是按规范来吧,谢谢
skyaspnet 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 2 楼 的回复:
协议就是要来遵守的,如果不遵守,后果的不可预知的。
你能请求成功,但是会让web服务器解析http时乱套,/号和换行符都是重要的符号标志。

这是对的,所以我给你的代码就没有去组装完整的数据段,这样就可避免人为的失误
[/Quote]

嗯,拼接字符很容易发生错误,有时候看得眼睛都花了
skyaspnet 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

不是用curl吗?网上找了一段是这样的:
Perl code

<?php
$url = 'http://www.myheritage.cn/FP/Company/tryFaceRecognition.php';//target url

$fields['file'] = '@'.'C:\Users\lzyy\Desktop\3431821560_5e18c02221.jpg';
$f……
[/Quote]

这个不是想要的
xuzuning 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

不是用curl吗?网上找了一段是这样的:
Perl code

<?php
$url = 'http://www.myheritage.cn/FP/Company/tryFaceRecognition.php';//target url

$fields['file'] = '@'.'C:\Users\lzyy\Desktop\3431821560_5e18c02221.jpg';
$f……
[/Quote]你的这个是对的
但LZ要求不使用真实存在的文件进行上传
你看一下他的前两个帖子就知道了
xuzuning 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
协议就是要来遵守的,如果不遵守,后果的不可预知的。
你能请求成功,但是会让web服务器解析http时乱套,/号和换行符都是重要的符号标志。
[/Quote]
这是对的,所以我给你的代码就没有去组装完整的数据段,这样就可避免人为的失误
coder 2012-04-10
  • 打赏
  • 举报
回复
不是用curl吗?网上找了一段是这样的:

<?php
$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
foolbirdflyfirst 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

协议就是要来遵守的,如果不遵守,后果的不可预知的。
你能请求成功,但是会让web服务器解析http时乱套,/号和换行符都是重要的符号标志。

比方说现在boundary块如下,注意Content-type:text~html,去除\r\n且把/换成~
PHP code
$boundary = md5(time());
$postStr = "";……
[/Quote]
你说的去掉\r\n,还有双引号转单引号,我本地试过都不行的,也在预料之中。
你说你那边居然可以,就有点出乎意料了,我也搞不懂了,不管如何,按照协议规范来构建http请求就好了。
skyaspnet 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

协议就是要来遵守的,如果不遵守,后果的不可预知的。
你能请求成功,但是会让web服务器解析http时乱套,/号和换行符都是重要的符号标志。

比方说现在boundary块如下,注意Content-type:text~html,去除\r\n且把/换成~
PHP code
$boundary = md5(time());
$postStr = "";
$postStr .="--"……
[/Quote]

貌似是可以上传成功的
foolbirdflyfirst 2012-04-10
  • 打赏
  • 举报
回复
协议就是要来遵守的,如果不遵守,后果的不可预知的。
你能请求成功,但是会让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串都作为文件名一部分了,所以我们预想的提交的文件内容也没解析到。
amani11 2012-04-10
  • 打赏
  • 举报
回复
如你所改,我测试,接收端,没有获取到期望的信息

或贴完整代码看看?

21,882

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧