Forms 使用curl发布多部分/表单数据的正确方法是什么?

Forms 使用curl发布多部分/表单数据的正确方法是什么?,forms,post,curl,Forms,Post,Curl,我使用此语法发布了一个文件和一些参数: 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()

我使用此语法发布了一个文件和一些参数:

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

以下语法为您修复了它:

curl -v -F key1=value1 -F upload=@localfilename URL

要在Windows中使用curl上传文件,我发现路径需要转义双引号

e、 g


这就是我的工作

curl --form file='@filename' URL

当我给出这个答案时(4年多前),我似乎并不真正理解这个问题,也不理解表单字段是如何工作的。我只是根据我在不同场景中的尝试来回答,这对我来说很有效

因此,首先,OP犯的唯一错误是没有在文件名之前使用
@
符号。其次,我的答案使用了
file=…
只对我有效,因为我试图上传的表单字段名为
file
。如果表单字段被称为其他名称,请改用该名称

解释 从
curl
;在选项的描述下,它表示:

这允许上载二进制文件等,以强制“内容” 要将零件作为文件,请在文件名前加上@符号。刚刚得到
在powershell中的Windows 10、curl 7.28.1中,我发现以下内容适合我:

$filePath = "c:\temp\dir with spaces\myfile.wav"
$curlPath = ("myfilename=@" + $filePath)
curl -v -F $curlPath URL

我很难将带有
curl
的多部分HTTP PUT请求发送到Java后端。我只是试了一下

curl-X放置URL\
--表头内容类型:多部分/表单数据;边界=------边界'\
--数据二进制@文件
文件的内容是

-----------BOUNDARY
Content-Disposition: form-data; name="name1"
Content-Type: application/xml;version=1.0;charset=UTF-8

<xml>content</xml>
-----------BOUNDARY
Content-Disposition: form-data; name="name2"
Content-Type: text/plain

content
-----------BOUNDARY--
一切正常

tl;dr 在多部分边界内容的开头添加一个换行符(CRLF
\r\n
),并在边界的开头添加一个
--
,然后重试


可能您正在向Java后端发送一个请求,该请求需要在边界中进行此更改。

Windows&curl.exe是否可能重复?多个附件如何?它在Windows和上的工作方式完全相同。它支持多个“附件”/文件:只需添加更多-F实例!这个答案有一个上传多个文件的好例子。这很有效。在curl上,我们不需要添加如下内容:
-H'内容类型:多部分/表单数据;boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
这个答案对我帮助很大。虽然在我的情况下,我不应该逃避
,但在Mac上,我应该像
curl-X POST-F key1=value1-F'image=@”/Users/ivkremer/Downloads/file name.jpg那样发送它“
;在我的例子中-我成功地在没有任何引号的情况下进行了传输:curl-v-F file=@/Users/path/to/file/testq.jpg在我的例子中,在Windows中,我不能使用单引号,而必须使用双引号,例如
curl-F“filename=@\”C:\temp\file.jpg“”https://someurl.com
使用Firefox web控制台复制POST数据时,我还注意到它使用了
\n
而不是
\r\n
。甚至mitmproxy copy as cURL也在使用
\n
,因此我必须使用mitmproxy复制原始请求。我在hexdump中看到它使用的是十六进制代码
0A
而不是
0D 0A
\r\n
是必需的。请看第19页。
-----------BOUNDARY
Content-Disposition: form-data; name="name1"
Content-Type: application/xml;version=1.0;charset=UTF-8

<xml>content</xml>
-----------BOUNDARY
Content-Disposition: form-data; name="name2"
Content-Type: text/plain

content
-----------BOUNDARY--
                          <-- here's the CRLF
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY--     <-- added '--' at the beginning