当前位置: 首页 > 知识库问答 >
问题:

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

郭翰翮
2023-03-14

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

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

共有3个答案

郭琦
2023-03-14

这就是我的工作

curl --form file='@filename' URL

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

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

curlmanpage;在选项--form的描述下,它说:

这允许上传二进制文件等。若要强制内容部分为文件,请在文件名前加上@符号。要从文件中获取内容部分,请在文件名前添加符号

如果您试图进行表单上传,则很可能希望使用@前缀来上传文件,而不是

现在我还必须补充一点,使用

同样,我也建议引用@符号。

您可能还对另一个题为“应用程序/x-www-form-urlencoded”或“多部分/表单数据”的问题感兴趣?

我这样说是因为curl提供了其他上传文件的方法,但它们在标题中设置的内容类型不同。例如,--data选项提供了一种类似的上传文件作为数据的机制,但使用了不同的内容类型进行上传。

无论如何,这就是我想说的关于这个答案,因为它开始获得更多的选票。我希望这有助于消除任何困惑,例如这个答案和公认答案之间的差异。除了这个解释,真的没有。

顾烨磊
2023-03-14

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

例如

curl -v -F 'upload=@\"C:/myfile.txt\"' URL
史朗
2023-03-14

以下语法为您修复了它:

curl -v -F key1=value1 -F upload=@localfilename URL
 类似资料:
  • 所以这个HTML代码以正确的格式提交数据给我。 谢了!

  • 问题内容: 好,这就是我得到的,基本上是单击一个按钮并执行以下代码: 除了传递给Monsterequest.php以外,其他所有东西似乎都按预期工作,该帖子没有传递到其自身上,并且页面在传递给主要父对象时基本上重新加载了它的自我…(我不确定是否是,但是monsterrequest.php本身似乎可以很好地工作,但是在加载时它根本无法按预期工作,我完全感到困惑。我基本上想发布数据而无需重新加载页面。

  • 这几天我一直被这个问题难住了。如果有人能给我指出正确的方向,我将不胜感激!我一直在想如何通过facebooks graph api发布图像。 我从Facebook上下载了一张图片,它通过图形API显示在画布元素中。我正在修改这个元素,在上面画文本,然后想把它上传回facebook。我被上传卡住了。 以下是我看过的有帮助的链接,但我仍然卡住了: Facebook Graph API——使用JavaS

  • 问题内容: 我正在尝试使用multipart / form-data标头在PHP中使用cURL发布图像,因为我发送给的API期望图像以多部分形式发送。 使用其他请求与API通讯时,我没有任何问题;仅发布图像是一个问题。 我在客户端使用此表单: 这是我要发布到的服务器(在这里我试图将此数据转发到API): 使用下面的代码,我可以看到我的请求标头: 现在可以正确显示请求标题中的内容类型。但是似乎图像未

  • 问题内容: 好,这就是我得到的,基本上是单击一个按钮并执行以下代码: 除了传递给Monsterequest.php以外,其他所有内容似乎都按预期工作,该帖子没有传递到其自身上,并且页面在传递给主要父对象时基本上重新加载了它的自我…(我不确定是否是,但是monsterrequest.php本身似乎可以很好地工作,但是在加载时它根本无法按预期工作,我完全感到困惑,我基本上想发布数据而不重新加载页面。

  • 我想从React获取文件上传并将其发送到SpringBoot。我试图从React FormData发布,它将包含文件名和XML文件的键值对。因此,当我尝试将FormData发布到后端(即Springboot)时,它返回: 这是我的Springboot控制器: 我已经尝试在Axios post请求的头中指定multipart/form-data,但似乎不起作用。问题出在我的请求里还是出在我的控制器上