curl

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

--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, --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