次のCURLコマンドを書き直して、オプションを使用せずに-F
、まったく同じHTTPリクエストを生成するにはどうすればよいですか?つまり、本体のmultipart/form-dataを直接渡すようにします。
curl -X POST -F example=test http://localhost:3000/test
次のCURLコマンドを書き直して、オプションを使用せずに-F
、まったく同じHTTPリクエストを生成するにはどうすればよいですか?つまり、本体のmultipart/form-dataを直接渡すようにします。
curl -X POST -F example=test http://localhost:3000/test
解決済み:
curl \
-X POST \
-H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" \
--data-binary @test.txt \
http://localhost:3000/test
ここtest.txt
には次のテキストが含まれ、最も重要なのはCRLF(\ r \ n)行末があります。
------------------------------4ebf00fbcf09
Content-Disposition: form-data; name="example"
test
------------------------------4ebf00fbcf09--
注:前者は行末を保持するため、--data-binary
プレーンオールドの代わりに使用することが重要です(これは非常に重要です)。-d
また、本文の境界は余分な。で始まることに注意してください--
。
これは非常に重要なので繰り返しますが、そのrequest-bodyファイルにはCRLF行末が必要です。行末をサポートするマルチプラットフォームのテキストエディタはjEdit(jEditで行末を設定する方法)です。
最終的な解決策だけでなく、私がこれをどのように解決したか(Ruby on Railsアプリでデバッグする)に興味がある場合は、ブログにデバッグ手順を書き留めました。
--form
引数を明示的に使用できます
curl -H "Content-Type: multipart/related" \
--form "data=@example.jpg;type=image/jpeg" http://localhost:3000/test
元の CURL ステートメント-d
を一時ファイルなしでワンライナーとして書き直した別の回答を次に示します。個人的には、一時ファイルのアプローチの方が理解しやすいと思いますが、参考のためにここにも入れておきます。
curl -X POST -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" -d $'------------------------------4ebf00fbcf09\r\nContent-Disposition: form-data; name="example"\r\n\r\ntest\r\n------------------------------4ebf00fbcf09--\r\n' http://localhost:3000/test
注: この$'blar'
構文は、bash が \r\n を CRLF トークンとして解析するようになっています。そのヒントに対するこの回答に感謝します。
これは私が使用しているものです。クリーンで、一時ファイルを必要とせず、ファイル全体をアップロードする場合に備えて RAM を大量に消費しないと思います (ファイルをメモリに読み込む必要はありません)。
# Set these two.
file='path/to/yourfile.ext'
url='http://endpoint.example.com/foo/bar'
delim="-----MultipartDelimeter$$$RANDOM$RANDOM$RANDOM"
nl=$'\r\n'
mime="$(file -b --mime-type "$file")"
# This is the "body" of the request.
data() {
# Also make sure to set the fields you need.
printf %s "--$delim${nl}Content-Disposition: form-data; name=\"userfile\"${nl}Content-Type: $mime$nl$nl"
cat "$file"
printf %s "$nl--$delim--$nl"
}
# You can later grep this, or something.
response="$(data | curl -# "$url" -H "content-type: multipart/form-data; boundary=$delim" --data-binary @-)"
これは、「Content-Type: multipart/related」を使用して 1 つの画像ファイルをアップロードすることです。
curl --trace trace.txt -X POST -H 'Content-Type: multipart/related; boundary=boundary_1234' --data-binary $'--boundary_1234\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{\r\n\t"title": "TestFile"\r\n}\r\n\r\n--boundary_1234\r\nContent-Type: image/jpeg\r\n\r\n' --data-binary '@Image0177.jpg' --data-binary $'\r\n--boundary_1234--\r\n' 'http://localhost:3000/google/upload/drive/v2/files?uploadType=multipart'
これは multipart/form-data リクエスト メソッド用です。ファイルをアップロードするには --form filename="@path/image.jpg;type=image/jpeg" を追加します
curl --form key="value" --form key="value" http://localhost:3000/test