我尝试向远程服务器发出POST
请求,目的是将图像文件上传到该服务器。我试图利用PHP的file_get_contents()
方法以字符串格式输出文件,但它似乎切断了POST
正文中的最后一个边界。
PHP代码,我设置了我的POST
正文和标题:
$boundary = '------------' . uniqid();
$curl->setHTTPHeader( array(
'Accept' => 'application/xml',
'Content-Type' => 'multipart/form-data;boundary=' . $boundary
) );
$img_data = getimagesize( $img_file );
$file_contents = file_get_contents( $img_file );
$xml_body = "\r\n";
$xml_body .= $boundary . "\r\n" .
"Content-Disposition: form-data; name=\"data\"\r\n\r\n" .
"<Image><filename>" . basename( $img_file ) . "</filename>" .
"<description>test</description>" .
"</Image>" .
"\r\n\r\n" .
$boundary . "\r\n";
$xml_body .= "Content-Disposition: form-data; name=\"image\"; filename=\"" . basename( $img_file ) . "\"\r\n" .
"Content-Type: " . $img_data['mime'] . "\r\n" .
"\r\n" . $file_contents . "\r\n" .
$boundary . "--"; // <-- this part doesn't seem to show up in the body
$body = $xml_body;
当我在请求发出之前尝试打印出来(使用error_log()
)主体时,似乎下边界被切断了:
[16-Mar-2016 06:15:45 UTC] Array
(
[method] => POST
[timeout] => 60
[redirection] => 5
[httpversion] => 1.1
[user-agent] => [redacted]
[reject_unsafe_urls] =>
[blocking] => 1
[headers] => Array
(
[Accept] => application/xml
[Content-Type] => multipart/form-data;boundary=------------56e8fa112c4b0
[connection] => close
[Accept-Encoding] => deflate;q=1.0, compress;q=0.5, gzip;q=0.5
[Content-Length] => 152510
)
[cookies] => Array
(
)
[body] =>
------------56e8fa112c4b0
Content-Disposition: form-data; name="data"
<Image><filename>my-pic.jpg</filename><description></description></Image>
------------56e8fa112c4b0
Content-Disposition: form-data; name="image"; filename="my-pic.jpg"
Content-Type: image/jpeg
ÿØÿà
我对两件事感到好奇:
1)我是否正确设置了请求?现在,当我测试它时,远程服务器正在使用401
http状态代码进行响应,这意味着它无法正常工作。
2)为什么下边界没有显示在我的错误日志中?
答案 0 :(得分:1)
根据代码,一切看起来都很好。 401
回复意味着您未获得授权。您是否遗漏了任何授权标头,登录cookie或其他一些身份验证参数?
您没有收到400 Bad Request
响应表明它至少符合HTTP和MIME规范。
下边界(以及来自其外观的大部分图像数据)被切断,因为根据PHP手册,error_log()
函数不是二进制安全的:
警告 -
error_log()
不是二进制安全的。message
将被截断 空字符。
由于图像包含空字符,因此第一个字符后的所有内容都被该函数截断。您可以通过将请求写入file_put_contents
的文件来调试您的请求,或者如果您要发布到的站点不使用HTTPS(或者您可以选择不使用它),您可以尝试使用Wireshark之类的数据包嗅探器)。