- GIDEON
- GIDEON STAFF BLOG
2009/02/19
					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
	
スクリプトの場合などはシェル変数などを利用すると、 もう少し見やすいスクリプトになるでしょう。
#!/bin/sh
    :
    :
# バウンダリ文字列は世界標準時基準時点からの秒数とする
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
    :
    :
	
							
						


















