file_get_contents() 似乎切断了边界
file_get_contents() seems to cut off boundary
我正在尝试向远程服务器发出 POST
请求,目的是向其上传图像文件。我试图利用 PHP 的 file_get_contents()
方法以字符串格式输出文件,但它似乎切断了 POST
body 中的最后一个边界。
PHP 我设置 POST
body 和 headers:
的代码
$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()
)body时,似乎下边界被切断了:
[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) 为什么我的错误日志中没有显示下边界?
根据代码,一切看起来都不错。 401
响应表示您未获得授权。您是否缺少任何授权 headers、登录 cookie 或其他类型的身份验证参数?
您没有收到 400 Bad Request
响应这一事实表明它至少符合 HTTP 和 MIME 规范。
下边界(以及大部分图像数据的外观)被截断,因为根据 PHP 手册,error_log()
函数不是二进制安全的:
Warning - error_log()
is not binary safe. message
will be truncated by
null character.
由于图像包含空字符,第一个字符之后的所有内容都会被函数截断。您可以通过将请求写入带有 file_put_contents
的文件来调试您的请求,或者如果您要发布到的站点不使用 HTTPS(或者您可以选择不使用它),您可以尝试使用像 Wireshark 这样的数据包嗅探器).
我正在尝试向远程服务器发出 POST
请求,目的是向其上传图像文件。我试图利用 PHP 的 file_get_contents()
方法以字符串格式输出文件,但它似乎切断了 POST
body 中的最后一个边界。
PHP 我设置 POST
body 和 headers:
$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()
)body时,似乎下边界被切断了:
[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) 为什么我的错误日志中没有显示下边界?
根据代码,一切看起来都不错。 401
响应表示您未获得授权。您是否缺少任何授权 headers、登录 cookie 或其他类型的身份验证参数?
您没有收到 400 Bad Request
响应这一事实表明它至少符合 HTTP 和 MIME 规范。
下边界(以及大部分图像数据的外观)被截断,因为根据 PHP 手册,error_log()
函数不是二进制安全的:
Warning -
error_log()
is not binary safe.message
will be truncated by null character.
由于图像包含空字符,第一个字符之后的所有内容都会被函数截断。您可以通过将请求写入带有 file_put_contents
的文件来调试您的请求,或者如果您要发布到的站点不使用 HTTPS(或者您可以选择不使用它),您可以尝试使用像 Wireshark 这样的数据包嗅探器).