WebサービスコードのHTTP PUTデータにアクセスできません
-
02-07-2019 - |
質問
すべて、
作成中のアプリケーションの一部として、着信イメージデータを受け入れるHTTP PUT Webサービスが必要です。これは、分析、検証、ローカルファイルストアへの追加が行われます。
サイズ検証後に問題が発生します
$ _ SERVER ['CONTENT_LENGTH']
には>があります値が0であり、この値はテストファイルのサイズと同じであるため、この時点まではすべて順調に進んでいると想定できますが、
を使用して着信ストリームデータを読み取ろうとすると
file_get_contents( 'php:// stdin');
空の文字列を取得します。私も使用してみました
file_get_contents( 'php:// input');
これにより、空の文字列と同じ結果が得られます。
ヘルプ、提案、または方向性を歓迎します。
NB:使用しています
- PHP 5.2.6
- Apache 2.0
解決
私の推測では、httpd.confを変更してPUT要求を拒否しないようにする必要があります。確認しましたか?
他のヒント
Apache HTTPDはデフォルトでPUTリクエストを拒否します。 mod_put:
をご覧ください。
http://perso.ec-lyon.fr/lyonel.vincent/ apache / mod_put.html
そしてこれをhttpd.confに追加します:
<Location /upload/dir> EnablePut On AuthType Basic AuthName "Web publishing" AuthUserFile /www/etc/passwd AuthGroupFile /www/etc/group <Limit PUT> require valid-user </Limit> </Location>
file_get_contents
は&quot; r&quot;を取りませんパラメーター- PHPマニュアルページを参照してください:
string file_get_contents ( string $filename [, int $flags...)
有効な $ flag
の値は、 FILE_USE_INCLUDE_PATH、FILE_TEXT、FILE_BINARY
です。
&quot; r&quot;を削除してみてくださいフラグを立てて再試行
編集-質問が更新され、&quot; r&quot;フラグは無視されていたので、明らかに問題の根本ではありません。
に関する報告されたPHPのバグがあるようですfile_get_contents
はHTTP POSTに対して空の文字列を返します。バグの説明から:
file_get_contents( 'php:// input')
(およびfile、fopen + fread
)も フォームを送信したときにPOSTデータを返す enctype =&quot; multipart / form-data&quot;。enctypeを指定せずに同じフォームを送信したとき(デフォルト &quot; application / x-www-form-urlencoded&quot;使用されます)すべて正常に動作します。
回避策は、指定されたフォームenctypeを multipart / form-data
から変更することであるように見えます。これは明らかに、画像のアップロードには理想的ではありません。 "http://www.w3.org/TR/html401/interact/forms.html" rel = "nofollow noreferrer"> W3 FORM仕様:
コンテンツタイプ&quot; application / x-www-form-urlencoded&quot;大量のバイナリデータまたは非ASCII文字を含むテキストを送信するには非効率的です。コンテンツタイプ&quot; multipart / form-data&quot;ファイル、非ASCIIデータ、バイナリデータを含むフォームの送信に使用する必要があります。
さらに編集
このバグは、お使いのPHPバージョンで解決されているようです。読み込まれているバッファが復帰/改行文字で始まっていないことを確認しましたか? Sitepoint で議論された、あなたといくらか似た問題があります。
入力で strlen
を実行して、長さを確認します。
2番目の引数として取得した r
は正しくありません。 file_get_contents
は、 fopen
が使用する a / r / w / a + / r + / w +
引数を使用しません。あなたはおそらくそれを削除したいだけです:
file_get_contents('php://input');
http://us3.php.net/file_get_contents を参照してください。