file_get_contents()似乎切断了边界

时间:2016-03-16 06:28:52

标签: php wordpress post curl file-get-contents

我尝试向远程服务器发出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)为什么下边界没有显示在我的错误日志中?

1 个答案:

答案 0 :(得分:1)

根据代码,一切看起来都很好。 401回复意味着您未获得授权。您是否遗漏了任何授权标头,登录cookie或其他一些身份验证参数?

您没有收到400 Bad Request响应表明它至少符合HTTP和MIME规范。

下边界(以及来自其外观的大部分图像数据)被切断,因为根据PHP手册,error_log()函数不是二进制安全的:

  

警告 - error_log()不是二进制安全的。 message 将被截断   空字符。

由于图像包含空字符,因此第一个字符后的所有内容都被该函数截断。您可以通过将请求写入file_put_contents的文件来调试您的请求,或者如果您要发布到的站点不使用HTTPS(或者您可以选择不使用它),您可以尝试使用Wireshark之​​类的数据包嗅探器)。