LoginSignup
96
68

More than 1 year has passed since last update.

curlのオプション--data, --data-binary, --data-raw, --data-urlencodeの違い

Last updated at Posted at 2017-06-19

--data, --data-binary, --data-raw, --data-urlencode はどれも似ているが、下記の点で微妙な違いがある。

  • @ファイル名でファイルの内容を送信するか
  • @ファイル名でファイルの中の改行文字を削除するか
  • データをURLエンコードするか
オプション @でファイル送信 @ファイル内の改行を削除 URLエンコード 代表的な用途
-d, --data, --data-ascii × JSONをPOSTする
--data-raw × - × JSONをPOSTする
--data-binary × × バイナリファイルをPOSTする
--data-urlencode × --getと一緒に指定してクエリー文字列をURLエンコードする

-d, --data, --data-asciiは完全に同じ。
--data-raw@ファイル名の記法を解釈しない。それ以外は-d, --dataと同じ。
--data-binary@ファイル名でファイルの内容をそのままPOSTデータとしたい場合向け。
--data-urlencodeContent-type: application/x-www-form-urlencodedでPOSTしたい場合向けで、以下の5種類の記法に対応しており、=@の扱いがやや特殊なので注意:

content
     contentをURLエンコードし、POSTデータとする。contentは = または @ を含んではならないことに注意。

=content
     contentをURLエンコードし、POSTデータとする。先頭の = 自体は取り除かれる。

name=content
      contentの部分をURLエンコードする。nameは自動的にURLエンコードされないので、自分でしておくことに注意。

@filename
     POSTするデータをファイルから読み込み、URLエンコードする。

name@filename
     ファイルからnameの値を読み込む。nameは自動的にURLエンコードされないので、自分でしておくことに注意。

改行文字の扱い

--data@a.txtでファイルを指定した場合、ファイル内の改行文字(CR, LF)を削除する。つまり

a.txt
a
b
c

というファイルを--data '@a.txt'で送信した場合、

abc

という3バイトが送信される。これが--data-urlencode '@a.txt'では

a%0Ab%0Ac%0A

となり、--data-binary '@a.txt'ではCR, LFをそのまま送る。

-F, --formの例

-F, --formmultipart/form-dataでのフォーム送信をエミュレートする。

# ファイルをアップロードする
curl -F "profile=@portrait.jpg" https://example.com/upload.cgi

# typeを指定してファイルをアップロードする
curl -F "web=@index.html;type=text/html" https://example.com/upload.cgi

# ファイル名を指定してファイルをアップロードする
curl -F "file=@localfile;filename=nameinpost" https://example.com/upload.cgi
96
68
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
96
68