Это то, что меня беспокоило некоторое время. Я создаю 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 :///больше не работает должным образом, поскольку в нем также есть файл.
Вот как я сейчас читаю данные по запросу 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 ://?
===== ОБНОВЛЕНИЕ #1 =====
Я пробовал только вышеуказанный метод, на самом деле не знаю, что я могу сделать еще.
Я не получил никаких ошибок, используя этот метод, кроме того, что я не получаю желаемого результата от размещенных данных и файлов.
===== ОБНОВЛЕНИЕ #2 =====
Я отправляю этот тестовый запрос с помощью клиента Zend _Http _следующим образом: (пока не было проблем с 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. Это эпично.