1

Apache ベンチマーク ポスト ファイルで奇妙な問題に直面しています。

ファイルのアップロードを処理する機能を強調する必要があります。それで、私はググって、投稿ファイルを適切に構築する方法を説明している投稿を見つけました。その内容は次のようになります。

--1234567
Content-Disposition: form-data; name="user_id"

3
--1234567
Content-Disposition: form-data; name="file"; filename="cf_login.png"
Content-Type: image/png

[base64 encoded file content]
--1234567--

abラインはこれです:

$ ab -c 1 -n 5 -v 4 -T 'multipart/form-data; boundary=1234567' -p post_file.txt http://localhost:3000/files

ab がリクエストを作成すると、生成されるヘッダーは次のようになります。

INFO: POST header == 
---
POST /files.json/ HTTP/1.0
Content-length: 229
Content-type: multipart/form-data; boundary=simpleboundary
Host: localhost:3000
User-Agent: ApacheBench/2.3
Accept: */*


---
LOG: header received:
HTTP/1.1 500 Internal Server Error 
Content-Type: text/html; charset=utf-8
Content-Length: 13265
X-Request-Id: 9ad57d19cd71886a1bb817d00fac651b
X-Runtime: 0.015504
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
Date: Tue, 25 Sep 2012 13:54:29 GMT
Connection: close

予想される戻り値は、raise params.inspect であり、データが反対側に到着しているかどうかを確認できます。境界を削除すると、params で受信したデータを確認できますが、これは私が望むものではありません。ファイルのアップロードを取得したい。

誰にもヒントがありますか?本当に感謝します。

4

1 に答える 1

8

答えを見つけたので、あなたと共有することにしました。

投稿ファイルに苦労した後、$_FILES 変数と $_REQUEST 変数を出力して、ファイルが正しく作成されたかどうかを確認するためだけに PHP スクリプトを作成することにしました。実際、Apache はファイルを完全に受信し、ファイル データやその他の要求パラメータを確認できました。

Rails では同じことは起こらず、HTTP 1.1 マルチパート トピックのドキュメントを読んだ後、問題が投稿ファイル形式に関連していたことに気付きました。

この種のファイルを作成するときは、詳細に作成する必要があります。これは、\r や \n などのすべての特殊文字を適切な場所に含めることを意味します。マルチパートは"\n"で機能するようになりました。"\r\n" で終わる "dos" 行が必要です。

したがって、正しい投稿ファイルは次のようになります (\r\n は説明用ですが、そこにあるはずですよね?):

--boundary_hash\r\n
Content-Disposition: form-data; name="your_form_field";\r\n
Content-Type: text/plain\r\n
\r\n
your form field data\r\n
--boundary_hash\r\n
Content-Disposition: form-data; name="another_field";\r\n
Content-Type: text/plain\r\n
\r\n
another field data\r\n
--boundary_hash\r\n
Content-Disposition: form-data; name="filename"; filename="cf_login.png"\r\n
Content-Type: image/png\r\n
\r\n
base64 file content\r\n
--boundary_hash--\r\n

このファイルを開くと、実際には次のように表示されます。

--boundary_hash
Content-Disposition: form-data; name="your_form_field";
Content-Type: text/plain

your form field data
--boundary_hash
Content-Disposition: form-data; name="another_field";
Content-Type: text/plain

another field data
--boundary_hash
Content-Disposition: form-data; name="filename"; filename="cf_login.png"
Content-Type: image/png

base64 file content
--boundary_hash--

お役に立てば幸いです。

乾杯。

于 2012-09-26T14:28:47.667 に答える