web-dev-qa-db-ja.com

-Fを使用せずにこのCURL multipart / form-dataリクエストを書き換えるにはどうすればよいですか?

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

curl -X POST -F example=test http://localhost:3000/test
31
William Denniss

解決済み:

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を使用することが重要です。前者は行末を保持するためです(非常に重要です)。また、本文の境界は余分な--で始まることに注意してください。

これは非常に重要なので繰り返しますが、そのリクエスト本文ファイルにはCRLF行末が必要です。行末を適切にサポートするマルチプラットフォームテキストエディタはjEditです( jEditで行末を設定する方法 )。

私がこれをどのように解決したかに興味がある場合(Ruby on Rails app)でデバッグし、最終的なソリューションだけでなく、デバッグを書き上げました 私のブログ の手順。

61
William Denniss

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

curl -H "Content-Type: multipart/related" \
  --form "[email protected];type=image/jpeg" http://localhost:3000/test
23
mimming

一時ファイルを使用せずに-dをワンライナーとして使用して書き直した元のCURLステートメントの代替回答を次に示します。個人的には、一時ファイルのアプローチの方が理解しやすいと思いますが、これも参照用にここに置いています。

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トークンとして解析します。 この答え に感謝します。

15
William Denniss

これは私が使用しているものです、私はそれがきれいで、一時ファイルを必要とせず、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 @-)"
2
Camilo Martin

これは、「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'
1
Mohan R

ここに私がそれをする方法があります:

curl https://httpbin.org/post \
    -H 'content-type: multipart/form-data; boundary=----FormBoundary123456789' \
    --data-binary $'------FormBoundary123456789\r
Content-Disposition: form-data; name="example"\r
\r
test\r
------FormBoundary123456789--\r
'

またはもう少し洗練された(ほとんどの最新のシェルに移植できるはずです):

DELIM=----FormBoundary$RANDOM$RANDOM

curl https://httpbin.org/post \
    -H "content-type: multipart/form-data; boundary=$DELIM" \
    --data-binary --$DELIM$'\r
Content-Disposition: form-data; name="example"\r
\r
test\r
'--$DELIM--$'\r
'
0
Eduardo