5

HTTP PUT を使用してファイルをアップロードしようとしています。
少し読んだ後、$_FILES配列は POST とmultipart/form-data. PUT を使用している間はphp://input、データを取得するために手動で読み取る必要があります。どちらの方法も機能しません。

次のオプションを試してみましたが、ヒントがあれば幸いです。

curl --upload avatar.jpg http://api.test.com/user/dsadasdsa
curl -X PUT -F "filedata=@avatar.jpg" http://api.test.com/user/dsadasdsa

私のPHPファイルはこれを印刷しようとしていますが、空の文字列を返します:

echo file_get_contents("php://input");

これは、PUT DELETE サポートがなく、nginx-extras がインストールされていない Nginx の問題である可能性があると考え始め、nginx 構成に以下を追加しましたが、残念ながらこれも役に立ちません。

root /var/www/;

dav_methods PUT DELETE MKCOL COPY MOVE;

create_full_put_path on;
dav_access group:rw all:r;
4

6 に答える 6

3

デバッグについていくつかのアイデアがあります。

var_dump(file_get_contents('php://input'));エコーの代わりにaを実行します。参照によると:

この関数はブール値の FALSE を返す場合がありますが、FALSE と評価される非ブール値を返す場合もあります。詳細については、ブール値のセクションを参照してください。この関数の戻り値をテストするには、=== 演算子を使用します。

as output が表示される場合はbool(false)、何か問題があり、読み取れませんphp://input。おそらく PHP の問題です。が表示された場合string(0) ""、(もう?) には何もないphp://inputため、nginx の問題である可能性が高くなります。

また、php://リファレンスphp://inputによると、とは併用できませんenctype="multipart/form-data"。あなたはそれを使わないのですか?慣れている場合は、HTML ファイルを試すこともできます。

デフォルトでは、エラー ログを確認することもでき/var/log/nginx/error.logます。また、HTTP 応答コードを確認してください。200ですか?そうでない場合、それは役立つコードですか?

于 2013-06-15T12:49:28.700 に答える
2

使用していたオプション -F により、curl は Content-Type multipart/form-data を使用してデータを POST します (man curl を参照)。

次のように --data-binary オプションを使用できます。

curl -X PUT --data-binary "@avatar.jpg" http://api.test.com/user/dsadasdsa

-d オプションはテキスト専用であり、データが破損する可能性があります。

私のテストでは、次のコマンドで同じ結果が得られます。

curl --upload "avatar.jpg" http://api.test.com/user/dsadasdsa

これが私のサーバーです

<?php
echo "request method : " . $_SERVER['REQUEST_METHOD'] . "\n";
echo "dump files ";
var_dump($_FILES);

$putdata = fopen("php://input", "r");
while ($data = fread($putdata, 1024)) {
      echo $data . "\n";
}
?>
于 2013-06-19T14:26:01.720 に答える
0

どちらの方法も機能しません

PHP で DAV を実装しようとしたことはありませんが、nginx を使用した場合でも、ファイルのアップロードを伴う POST が機能することは保証できます。

curl --upload avatar.jpg http://api.test.com/user/dsadasdsa

私はこれがうまくいくことを期待していたでしょう - あなたのログは何を示していますか? 「--trace」で試しましたか?

curl -X PUT -F "filedata=@avatar.jpg" http://api.test.com/user/dsadasdsa

curl で -F フラグを使用すると、multipart/form-data エンコーディングを使用してファイルを POST 変数としてアップロードすることになりますが、これは PUT 要求では意味がありません。

于 2013-06-21T14:57:04.837 に答える
0

nginx の背後に別の種類の webapp を配置し、PUT アップロードを処理できるかどうかをテストすることで、問題の原因として PHP を排除しましたか? 非常に短い Python Flask アプリを使用すると、PUT アップロードを別の言語でテストできます。

于 2013-06-22T01:26:02.663 に答える