2009/02/18
wget でファイル送信
wget (1) でファイルを送信する必要が生じたので、 ブラウザでファイルを送信する際のパケットをキャプチャして 通信内容を調べてみる。
想定しているのは input type='file'、
enctype='multipart/form-data' を指定した
フォームによるファイル送信処理。
通常の http ヘッダ以外に "Content-Type" と
"boundary" を wget (1) の
--header オプションで指定し、
multipart/form-data 形式に整形した送信するファイルの内容を
--post-data オプションで指定するだけで送信できる。
Content-Type は 'multipart/form-data'、
boundary は送信するデータの中に含まれない
任意の文字列を指定すれば問題ない。
multipart/form-data 形式は以下の形式に整形する。
--任意の文字列 Content-Disposition: form-data; name="フォーム名"; filename="ファイル名" Content-Type: text/plain (空行) ファイルの中身 (空行) --任意の文字列
実際にコマンドライン形式に記述するとこの様になる。
wget --header="Content-Type: multipart/form-data; boundary=バウンダリ" \ --post-data=' --バウンダリ Content-Disposition: form-data; name="フォーム名"; filename="ファイル名" Content-Type: text/plain ファイルの中身 : --バウンダリ ' 送信先URL
スクリプトの場合などはシェル変数などを利用すると、 もう少し見やすいスクリプトになるだろう。
: : # バウンダリ文字列は世界標準時基準時点からの秒数とする boundary="boundary-`date '+%s'`" # 受信する cgi の <input type="file" name="..."> で指定されるフォーム名 formname="フォーム名" # 送信するファイル filename="ファイル名" # 送信するファイルのデータ contents="`cat ${filename}`" # multipart/form-data 形式のデータ生成 data=" --${boundary} Content-Disposition: form-data; name='${formname}'; filename='${filename}' Content-Type: text/plain ${contents} --${boundary} " # ファイルの送信処理 wget --header="Content-Type: multipart/form-data; boundary=${boundary}" \ --post-data="$data" 送信先 URL : :