これはしばらくの間私を悩ませてきたものです..私は時々ファイルを受信しなければならないRESTfulAPIを構築しています。
を使用すると、と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' => '...'
));
=====ソリューション=====
主にHTTPPUTはHTTPPOSTに似ているという、いくつかの間違った仮定をしたことがわかりました。以下で読むことができるように、DaveRandomは、HTTPPUTは同じリクエストで複数のファイルを転送するためのものではないことを説明しました。
フォームデータの転送を本文からURLクエリ文字列に移動しました。これで、本文は単一のファイルの内容を保持します。
詳細については、DaveRandomの回答を参照してください。それは叙事詩です。