Как получить файл через HTTP PUT с помощью PHP

Это то, что меня беспокоило некоторое время. Я создаю RESTful API, который в некоторых случаях должен получать файлы.

При использовании HTTP POSTмы можем прочитать data from $_POSTи files from $_FILES.

При использовании HTTP GETмы можем прочитать data from $_GETи files from $_FILES.

Однако при использовании HTTP PUTAFAIK единственный способ прочитать данные — использовать 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. Это эпично.

30
задан Maurice 17 August 2012 в 15:39
поделиться