Jak odbierać plik przez HTTP PUT z PHP

To jest coś, co przez jakiś czas mnie dręczyło. Buduję API RESTful, które czasami odbiera pliki.

Podczas używaniaHTTP POSTmożemy czytaćdata from $_POST ifiles from $_FILES.

Podczas używaniaHTTP GETmożemy czytaćdata from $_GET ifiles from $_FILES.

Jednak podczas używaniaHTTP PUT, AFAIK jedynym sposobem na odczyt danych jest użyciephp://input stream.

Wszystko dobrze i dobrze, dopóki nie chcę wysłać pliku przez HTTP PUT. Teraz strumień wejściowy php: // nie działa już zgodnie z oczekiwaniami, ponieważ ma tam również plik.

Oto, jak obecnie czytam dane na żądanie PUT:

(który działa świetnie, dopóki nie ma opublikowanych plików)

$handle  = fopen('php://input', 'r');
$rawData = '';
while ($chunk = fread($handle, 1024)) {
    $rawData .= $chunk;
}

parse_str($rawData, $data);

Kiedy wyprowadzam rawData, pokazuje

-----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

Czy ktoś wie, jak poprawnie odbierać pliki przez HTTP PUT lub jak analizować pliki ze strumienia wejściowego php: //?

===== AKTUALIZACJA # 1 =====

Próbowałem tylko powyższej metody, nie mam pojęcia, co mogę zrobić.

Za pomocą tej metody nie otrzymałem żadnych błędów, poza tym nie otrzymałem pożądanego wyniku opublikowanych danych i plików.

===== UPDATE # 2 =====

Wysyłam to żądanie testowe za pomocą Zend_Http_Client w następujący sposób: (dotychczas nie miałem żadnych problemów z 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' => '...'
));

===== ROZWIĄZANIE =====

Okazuje się, że zrobiłem kilka błędnych założeń, głównie że HTTP PUT będzie podobny do HTTP POST. Jak możesz przeczytać poniżej, DaveRandom wyjaśnił mi, że HTTP PUT nie jest przeznaczony do przesyłania wielu plików na to samo żądanie.

Przesunąłem teraz transfer danych formalnych z ciała do kwerendy url. Ciało zawiera teraz zawartość pojedynczego pliku.

Aby uzyskać więcej informacji, przeczytaj odpowiedź DaveRandoma. To epickie.

questionAnswers(5)

yourAnswerToTheQuestion