以前 「wgetでpost ログイン認証 とpostダウンロード」の話でログイン認証のところはやったので、その件はそちらを参照。
アップロードサイト側のHTML
http://www.xxxx.jp/upload.htm の中身
を例にとってすすめてみる。
アップロード用のファイル名入力欄とサブミットボタンがあるだけの
フォームになる。
これを想定して
また、このupload.cgi はテキストファイルのみを受け付けるとし、
ファイル名 abc.txt をアップロードする
内容は
abcdef
1234
******* 以上2行 のみのテキストデータ
文字10個、(crlf)改行2個 合計14バイト
これをIEでアップロードすると以下のようなstreamを吐き出す。
Cookie: までがヘッダ部、ひとつ改行のみの行のあと最後までがデータ部
バウンダリはハイフンを全て削ってみました。
wgetを使えばcontentilengthとhostは勝手に設定されるので考えなくて良い。
cookieはログイン認証などでセッションキーとして使っている場合必須。
もうひとつContent-Typeは
Content-Type: multipart/form-data; boundary=
boundary=のところまではファイルアップロードの場合固定(だと思う)
マルチパートデータの区切りとして認識するための
バウンダリ文字列は、データの中に同じ文字がはいらなければいいのでもっと短くてもOk
IEではたくさんのハイフォンのあと13桁の英数字を付けている。
データ部は、
もう少し説明を加えると、
ハイフォンがいっぱいでわかりにくいが、データ内に記述するバウンダリはヘッダで示した文字の前に--を付けることになっているので2個多い。
パート内のヘッダ では、ファイル名を入れるHTMLformのinput,type=fileのnameを指定。
アップロードするファイルのcontenttypeを指定、上記の場合はテキストファイルなのでtext/plainを指定した。
WGETでファイルをアップロードする場合 --post-file "xxxx" のオプションを使うわけだが、xxxxはアップするファイルではなくバウンダリなど必要な情報を付加したものをしていしなければならない。
--post-data "xxxx" の"xxxx"部分をファイルから読み込んでいるに過ぎない。
以下の8行をupfile.data とか名前を付けて保存しておいて
wget コマンドラインは
cookieは認証などなければいらない。
boundary は適当に変えてやれば、出来上がり。
そのほかtimeoutなどのオプションを追加すれば、バッチリ
ということで、何らかのスクリプトでwgetをドライブしてやらないかぎり手作業ではほぼ不可能だと思われる。
また、前の説明でもあるように、perlにはLWPというとても簡便な方法があるのでそちらのほうがよさそう。
しかし、LWPでは現在https+proxyがダメなのでこのWGETを使って処理している。
アップロードサイト側のHTML
http://www.xxxx.jp/upload.htm の中身
を例にとってすすめてみる。
**** ここから ********** <html lang="ja"> <head></head> <body> <form name="f1" method="post" enctype='multipart/form-data' action='/cgi-bin/upload.cgi'> アップロードファイル <input type='file' size='60' name='file1'> <input type="button" value="決定" onClick="submit();"> </form> </body> </html> **** ここまで ********** |
アップロード用のファイル名入力欄とサブミットボタンがあるだけの
フォームになる。
これを想定して
また、このupload.cgi はテキストファイルのみを受け付けるとし、
ファイル名 abc.txt をアップロードする
内容は
abcdef
1234
******* 以上2行 のみのテキストデータ
文字10個、(crlf)改行2個 合計14バイト
これをIEでアップロードすると以下のようなstreamを吐き出す。
***** ここから ******** POST /cgi-bin/upload.cgi HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://www.xxxx.jp/index.htm Accept-Language: ja Content-Type: multipart/form-data; boundary=---------------------------7d632a24d0650 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MathPlayer 2.0; .NET CLR 2.0.50727) Host: www.xxxx.jp Content-Length: 245 Connection: Keep-Alive Cache-Control: no-cache Cookie: xxxx1=yyyy;xxxx2=aaa -----------------------------7d632a24d0650 Content-Disposition: form-data; name="file1"; filename="C:abc.txt" Content-Type: text/plain abcdef 1234 -----------------------------7d632a24d0650-- ***** ここまで ******** |
Cookie: までがヘッダ部、ひとつ改行のみの行のあと最後までがデータ部
バウンダリはハイフンを全て削ってみました。
ヘッダ部で必須なのは Content-Type: multipart/form-data; boundary=7d632a24d0650 Host: www.xxxx.jp Content-Length: 245 Cookie: xxxx1=yyyy;xxxx2=aaa 以上4行 |
wgetを使えばcontentilengthとhostは勝手に設定されるので考えなくて良い。
cookieはログイン認証などでセッションキーとして使っている場合必須。
もうひとつContent-Typeは
Content-Type: multipart/form-data; boundary=
boundary=のところまではファイルアップロードの場合固定(だと思う)
マルチパートデータの区切りとして認識するための
バウンダリ文字列は、データの中に同じ文字がはいらなければいいのでもっと短くてもOk
IEではたくさんのハイフォンのあと13桁の英数字を付けている。
データ部は、
--バウンダリ パート内のヘッダ 1行あける ファイルの中身 --バウンダリ-- |
もう少し説明を加えると、
ハイフォンがいっぱいでわかりにくいが、データ内に記述するバウンダリはヘッダで示した文字の前に--を付けることになっているので2個多い。
パート内のヘッダ では、ファイル名を入れるHTMLformのinput,type=fileのnameを指定。
アップロードするファイルのcontenttypeを指定、上記の場合はテキストファイルなのでtext/plainを指定した。
WGETでファイルをアップロードする場合 --post-file "xxxx" のオプションを使うわけだが、xxxxはアップするファイルではなくバウンダリなど必要な情報を付加したものをしていしなければならない。
--post-data "xxxx" の"xxxx"部分をファイルから読み込んでいるに過ぎない。
以下の8行をupfile.data とか名前を付けて保存しておいて
--7d632a24d0650 Content-Disposition: form-data; name="file1"; filename="C:abc.txt" Content-Type: text/plain abcdef 1234 --7d632a24d0650-- |
wget コマンドラインは
wget --header "Cookie: xxxx1=yyyy;xxxx2=aaa" --header="Content-Type: multipart/form-data; boundary=7d632a24d0650" --post-file="upfile.data" http://www.xxxx.jp/cgi-bin/upload.cgi |
cookieは認証などなければいらない。
boundary は適当に変えてやれば、出来上がり。
そのほかtimeoutなどのオプションを追加すれば、バッチリ
ということで、何らかのスクリプトでwgetをドライブしてやらないかぎり手作業ではほぼ不可能だと思われる。
また、前の説明でもあるように、perlにはLWPというとても簡便な方法があるのでそちらのほうがよさそう。
しかし、LWPでは現在https+proxyがダメなのでこのWGETを使って処理している。
bbcode
html
http://googlee.te/ simple
а
а
а
а
а
а
а
а
а