--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-urlencode
はContent-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
, --form
はmultipart/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