LoginSignup
11
9

More than 5 years have passed since last update.

wget(1) でファイル送信

Last updated at Posted at 2013-03-11

wget(1) でファイルを送信する方法です。
想定しているのは

<input type='file' enctype='multipart/form-data'>

が指定されたフォームによるファイル送信処理です。

通常の http ヘッダ以外に Content-Typeboundarywget(1) の --header オプションで指定し、multipart/form-data 形式に整形した送信するファイルの内容を --post-data オプションで、もしくは格納したファイルのファイル名を --post-file オプションで指定するだけで送信できます。
Content-Type は multipart/form-data、boundary は送信するデータの中に含まれない任意の文字列を指定すれば問題ない様です。

multipart/form-data 形式は以下の形式に整形します。

--任意の文字列
Content-Disposition: form-data; name="フォーム名"; filename="ファイル名"
Content-Type: text/plain
(空行)
ファイルの中身
(空行)
--任意の文字列

シェルスクリプトなどから利用する場合は関数にしてしまうのが良いと思います。
ファイルの中身が少ない場合はバウンダリ情報などを全てシェル変数に格納して --post-data オプションによる指定をする事も可能ですが、シェル変数にはセットできる文字数に制限があるのでファイルの中身が大きい場合全ての情報をファイルに出力して --post-file オプションによる指定をして転送する必要がああります。

sample.sh
#
# ファイルのアップロード処理
#   $1: アップロードファイル
#   $2-: URL 情報など
#
upload()
{

    local   _boundary _data

    # バウンダリ文字列は日付時間を利用する
    _boundary="boundary-`date '+%Y%m%d'`"
    # 情報を格納するファイル
    _data="${TMP:-/tmp}/_putifle.${1##*/}"

    {
        cat <<EOF
--${_boundary}
Content-Disposition: form-data; name="${element}"; filename="${2}.tgz"
Content-Type: application/octet-stream

EOF
        cat ${1}
        cat <<EOF

--${_boundary}
EOF
    } > ${_data}

    # ファイル名を shift
    shift

    wget "--header=\"Content-Type: multipart/form-data; boundary=${_boundary}\"\
         --post-file=\"${_data}\"" ${*}

}

実際の処理ではエラーハンドリングなどが必要になると思いますので動作の骨子のみとなりますが、これで無事に転送できると思います。

11
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9