有一件事情困扰了我一段时间.. 我正在构建一个RESTful API,需要在某些情况下接收文件。
使用HTTP POST
时,我们可以从$_POST
读取数据,从$_FILES
读取文件。
使用HTTP GET
时,我们可以从$_GET
读取数据,从$_FILES
读取文件。
然而,使用HTTP PUT
时,据我所知,读取数据的唯一方法是使用php://input stream
。
一切都很好,但是当我想通过HTTP PUT发送文件时,php://input流就不再像预期的那样工作,因为它里面也有一个文件。
这是我目前如何读取PUT请求中的数据:
(只要没有文件被发布,这个方法就很好用)
$handle = fopen('php://input', 'r');
$rawData = '';
while ($chunk = fread($handle, 1024)) {
$rawData .= $chunk;
}
parse_str($rawData, $data);
当我输出rawData时,它显示为:-----ZENDHTTPCLIENT-44cf242ea3173cfa0b97f80c68608c4c
Content-Disposition: form-data; name="image_01"; filename="lorem-ipsum.png"
Content-Type: image/png; charset=binary
�PNG
���...etc etc...
���,
-----ZENDHTTPCLIENT-8e4c65a6678d3ef287a07eb1da6a5380
Content-Disposition: form-data; name="testkey"
testvalue
-----ZENDHTTPCLIENT-8e4c65a6678d3ef287a07eb1da6a5380
Content-Disposition: form-data; name="otherkey"
othervalue
有人知道如何正确地通过HTTP PUT接收文件,或如何从php://input流中解析文件吗?
===== 更新 #1 =====
我已经尝试过以上方法,不太清楚还能做什么。
使用此方法时没有出现任何错误,除了我没有获得所需的发布数据和文件之外。
===== 更新 #2 =====
我正在使用Zend_Http_Client发送此测试请求,如下所示: (到目前为止,我还没有遇到任何Zend_Http_Client的问题)
$client = new Zend_Http_Client();
$client->setConfig(array(
'strict' => false,
'maxredirects' => 0,
'timeout' => 30)
);
$client->setUri( 'http://...' );
$client->setMethod(Zend_Http_Client::PUT);
$client->setFileUpload( dirname(__FILE__) . '/files/lorem-ipsum.png', 'image_01');
$client->setParameterPost(array('testkey' => 'testvalue', 'otherkey' => 'othervalue');
$client->setHeaders(array(
'api_key' => '...',
'identity' => '...',
'credential' => '...'
));
===== 解决方法 =====
结果我犯了一些错误的假设,主要是认为HTTP PUT与HTTP POST类似。正如下面所述,DaveRandom向我解释了HTTP PUT不适用于在同一请求中传输多个文件。
我现在已经将表单数据的传输从正文移到了URL查询字符串中。现在正文中保存单个文件的内容。
有关更多信息,请阅读DaveRandom的答案。它很棒。