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


25

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

Wgetは現在、POSTデータを送信するためのmultipart / form-dataをサポートしていません。application / x-www-form-urlencodedのみ。だけの1 --post-data--post-file指定する必要があります。

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

回答:


31

カールを使用:

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

17

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

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

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

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

また、ポストデータファイルには次のようなものが含まれている必要があります。

--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属性は、wgetの呼び出しのBOUNDARY値と一致する必要があります。(例のFILEUPLOAD)
  3. すべての境界の前に2つのハイフン「-」が付き、\ r \ nで終了します
  4. 最後の境界には、2つの余分なハイフン「-」が付加され、\ r \ nで終了します
  5. 各データ、ファイルコンテンツ、またはパラメーター値は、空の行「\ r \ n」で囲まれています

制御された環境の中にはwgetはあるがcurlはないので、これは誰かの助けになると思った。


wgetをバイナリファイルで動作させることができませんでした。投稿データファイルのテキスト部分を作成し、保存、使用cat pic.jpg >> postdata、Notepad ++にロードし、最後の境界+ '-' + EOLを追加しました。W3Cリファレンス
クロエ

@Chloe、私は別のプロジェクトのためにこれを再検討しなければならなかった、そして今回はバイナリファイルが必要であり、期待通りに機能することがわかった。単純なphpファイルアップロードページを作成し、ブラウザーを介して最初にファイルサイズを取得してから、wgetを使用した結果と比較しました。迷った改行はプロセス全体を失敗させる可能性があるため、同じことを行うことをお勧めします。
tu-Reinstate Monica-dor du

1
セミコロンがありません。pythonで問題が発生しましたtornado --header = "Content-type:multipart / form-data; boundary = FILEUPLOAD"
FlappySocks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.