--data, --data-binary, --data-raw, --data-urlencode はどれも似ているが、下記の点で微妙な違いがある。
-
@ファイル名でファイルの内容を送信するか -
@ファイル名でファイルの中の改行文字を削除するか - データをURLエンコードするか
| オプション | @でファイル送信 | @ファイル内の改行を削除 | URLエンコード |
|---|---|---|---|
| -d, --data, --data-ascii | ○ | ○ | × |
| --data-raw | × | - | × |
| --data-binary | ○ | × | × |
| --data-urlencode | ○ | × | ○ |
-d, --data, --data-asciiは完全に同じ。
--data-rawは@ファイル名の記法を解釈しない。それ以外は-d, --dataと同じ。
--data-binaryはローカルにあるバイナリファイルを@ファイル名で送りたい場合向け。
--data-urlencodeは以下の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