web-dev-qa-db-ja.com

multipart / form-dataとしてHTTP経由でファイルをアップロードするLinuxコマンドラインツール?

Wgetに--post-fileオプションがあることがわかりますが、マンページには

Wgetは現在、POSTデータを送信するためのmultipart/form-dataをサポートしていません。application/ x-www-form-urlencodedのみです。--post-data--post-fileのどちらかのみ指定する。

Multipart/form-dataでファイルをアップロードするための同様の方法はありますか?

25
kdt

カールを使用:

curl -F "file=@localfile;filename=nameinpost" url.com
31
Tobu

これはwgetでのみ実行できます。少なくともバージョン1.13.4と多分他のもので。 --post-fileオプションを使用すると、postdataファイルが適切に構築されている限り、送信するファイルを指定できます。

また、これをバイナリファイルでテストしましたが、期待どおりに動作します。ファイルをbase64エンコードする必要はありませんが、ファイルに境界が含まれていないことを確認する必要があります。

この作業を行うために最低限必要なコマンドは次のとおりです。

wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform

そしてpostdataファイルは次のようなものを含む必要があります:

--FILEUPLOAD
Content-Disposition: form-data; name="comment"

I love uploading files!

--FILEUPLOAD
Content-Disposition: form-data; name="uploadFile"; filename="myfile.bin"; 
Content-Type: application/octet-stream
Media Type: application/octet-stream

Give me some automated file upload action!

--FILEUPLOAD--

ここでは、いくつかの詳細が重要です。

  1. 投稿データファイルの行は\ r\nで終了します。唯一の例外は、ファイルコンテキスト内のデータです。
  2. PostdataのすべてのBOUNDARY属性mustは、wgetの呼び出しのBOUNDARY値と一致します。 (例ではFILEUPLOAD)
  3. すべての境界には2つのハイフン「-」が前に付き、\ r\nで終わります
  4. 最後の境界は、2つの追加のハイフン「-」で終わり、\ r\nで終了します
  5. 各データ、ファイルの内容、またはパラメータ値は、空の行「\ r\n」で囲まれています

一部の制御された環境ではwgetがカールしていないため、これが誰かを助けるかもしれないと思いました。