228

この構文を使用して、いくつかのパラメーターとともにファイルを投稿しました。

curl -v -include --form "key1=value1" --form upload=localfilename URL

ファイルのサイズは約 500K です。まず、送信側のコンテンツの長さは 254 であることがわかります。その後、サーバーの応答のコンテンツの長さは 0 になります。どこが間違っているのでしょうか?

コマンドの完全なトレースを次に示します。

* Couldn't find host xxx.xxx.xxx.xxx in the _netrc file; using defaults
* About to connect() to xxx.xxx.xxx.xxx port yyyy (#0)
*   Trying xxx.xxx.xxx.xxx...
* Adding handle: conn: 0x4b96a0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x4b96a0) send_pipe: 1, recv_pipe: 0
* Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) port yyyy (#0)
* POST /zzzzzz/UploadFile HTTP/1.1
* User-Agent: curl/7.32.0
* Host: xxx.xxx.xxx.xxx:yyyy
* Accept: */*
* Content-Length: 254
* Expect: 100-continue
* Content-Type: multipart/form-data; boundary=------------------------948a6137eef50079
*
* HTTP/1.1 100 Continue
* HTTP/1.1 100 Continue

* HTTP/1.1 200 OK
* HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
* Server: Apache-Coyote/1.1
* Server: Apache-Coyote/1.1
* Added cookie JSESSIONID="C1D7DD042E250211D9DEA82688876F88" for domain xxx.xxx.xxx.xxx, path /zzzzz/, expire 0
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/;
* HttpOnly
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/; HttpOnly
* Content-Type: text/html;charset=ISO-8859-1
Content-Type: text/html;charset=ISO-8859-1
* Content-Length: 0
* Content-Length: 0
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Connection #0 to host xxx.xxx.xxx.xxx left intact
4

6 に答える 6

327

次の構文で修正できます。

curl -v -F key1=value1 -F upload=@localfilename URL
于 2013-10-02T23:59:24.140 に答える
19

これは私のために働いたものです

curl --form file='@filename' URL

この回答をしたとき(4年以上前)、質問やフォームフィールドの仕組みがよくわからなかったようです。異なるシナリオで試したことに基づいて答えただけで、うまくいきました。

まず、OPが犯した唯一の間違いは@、ファイル名の前にシンボルを使用しなかったことです。第二に、私file=...がアップロードしようとしていたフォームフィールドがfile. フォーム フィールドが別の名前である場合は、代わりにその名前を使用してください。

説明

curl マンページから; オプションの説明の下に次のように表示されます--form

これにより、バイナリ ファイルなどのアップロードが可能になります。「コンテンツ」部分を強制的にファイルにするには、ファイル名の前に @ 記号を付けます。ファイルからコンテンツ部分だけを取得するには、ファイル名の前に記号 < を付けます。@ と < の違いは、@ はファイルのアップロードとして投稿にファイルを添付するのに対し、< はテキスト フィールドを作成し、そのテキスト フィールドのコンテンツをファイルから取得することです。

フォームのアップロードを行おうとしている場合、ファイルのコンテンツをアップロードするの@ではなく、プレフィックスを使用してファイルをアップロードする可能性が高いでしょう。<

補遺

ここで、シンボルの使用には注意が必要であることも追加する必要があります。これは<、ほとんどの UNIX シェルで<は入力リダイレクト シンボルであるためです[これは、指定されたファイルの内容を前にプログラムのコマンド標準入力に偶然にも提供します<]。これは、そのシンボルを適切にエスケープしたり、引用符で囲んだりしないと、curlコマンドが期待どおりに動作しないことに気付く可能性があることを意味します。

その同じメモで、@シンボルを引用することもお勧めします。


application/x-www-form-urlencoded または multipart/form-data?というタイトルの別の質問にも興味があるかもしれません。

curlファイルをアップロードする他の方法を提供するため、これを言いますが、ヘッダーに設定されているコンテンツタイプが異なります。たとえば、この--dataオプションは、ファイルをデータとしてアップロードするための同様のメカニズムを提供しますが、アップロードには異なるコンテンツ タイプを使用します。

とにかく、この回答がより多くの賛成票を獲得し始めたので、私がこの回答について言いたかったのはそれだけです。これが、この回答と受け入れられた回答の違いなどの混乱を解消するのに役立つことを願っています。この説明を除いて、実際には何もありません。

于 2016-03-10T08:30:18.077 に答える
-2

たぶん、このフォームは機能します

curl -X POST -d 'key1=value1&key2=value2' http://URL -H "Content-Type: application/x-www-form-urlencoded"

于 2021-12-07T17:03:05.147 に答える