这是困扰我一段时间的事情。我正在构建一个 RESTful API,它必须在某些情况下接收文件。
使用时HTTP POST
,我们可以读取data from $_POST
和files from $_FILES
。
使用时HTTP GET
,我们可以读取data from $_GET
和files from $_FILES
。
但是,在使用 时HTTP PUT
,AFAIK 读取数据的唯一方法是使用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 的答案。这是史诗。