43

次のCURLコマンドを書き直して、オプションを使用せずに-F、まったく同じHTTPリクエストを生成するにはどうすればよいですか?つまり、本体のmultipart/form-dataを直接渡すようにします。

curl -X POST -F example=test http://localhost:3000/test
4

7 に答える 7

74

解決済み:

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アプリでデバッグする)に興味がある場合は、ブログにデバッグ手順を書き留めました。

于 2012-05-26T09:57:17.753 に答える
31

--form引数を明示的に使用できます

curl -H "Content-Type: multipart/related" \
  --form "data=@example.jpg;type=image/jpeg" http://localhost:3000/test
于 2012-12-11T18:56:44.690 に答える
16

元の 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 トークンとして解析するようになっています。そのヒントに対するこの回答に感謝します。

于 2012-05-26T10:30:01.170 に答える
5

これは私が使用しているものです。クリーンで、一時ファイルを必要とせず、ファイル全体をアップロードする場合に備えて 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 @-)"
于 2016-02-24T08:24:14.230 に答える
1

これは、「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'
于 2014-04-03T05:47:49.673 に答える
-3

これは multipart/form-data リクエスト メソッド用です。ファイルをアップロードするには --form filename="@path/image.jpg;type=image/jpeg" を追加します

curl --form key="value" --form key="value" http://localhost:3000/test

于 2016-01-19T11:01:41.640 に答える