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 这样的数据包嗅探器).