【发布时间】:2012-08-13 21:38:57
【问题描述】:
这是困扰我一段时间的事情。我正在构建一个 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 的回答。这是史诗。
【问题讨论】:
-
嗯?然后你会得到什么错误然后你尝试这样做?
-
您是如何发送请求的? php://input 仅在多部分请求中不起作用...
-
multipart/formdata 应该生成一个填充的 $_FILES。
-
@Jack 不使用 PUT 方法。
-
@DaveRandom 很不幸 :) 只剩下手动 mime 解码的选项。