使用curl进行multipart/form-data文件上传

10
我有一个服务器API,它是针对Fiddler使用的格式开发的,用于执行文件的HTTP post,这是一个multipart/form-data post。我试图让curl做类似的事情(这样我就可以停止使用Fiddler进行测试,而是让一个单独的程序通过curl进行调用)。
以下是Fiddler中的设置,这是我需要复制的。要上传的文件是myfile.html:
---------------------------acebdf13572468
Content-Disposition: form-data; name="fieldNameHere"; filename="myfile.html"
Content-Type: text/html

<@INCLUDE *C:\myfiles\myfile.html*@>
---------------------------acebdf13572468--

所需的是让curl生成类似的内容:特别是name=部分,后跟此部分底部的文件内容。我已尝试使用以下方法:

curl -F "fieldNameHere=myfile.html" http://myapi.com/

当我这样做时,它似乎完全忽略了我的文件。如果我添加-v,这是详细输出:

POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: perl-h4.factset.io
Accept: */*
Content-Length: 166
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------981301fdaeb3

这个HTML文件没有任何文件内容。所以我认为可能是我漏掉了一些基本的东西。如果有任何指针,都非常欢迎。

此外,我已经检查了其他类似于这样的StackOverflow问题:什么是使用curl POST多部分/表单数据的正确方法?

但它们基本上都说要做像我在这里做的那样的事情。所以也许问题不在我的语法上,而是因为某种原因它不想读取文件。

2个回答

23
curl -X POST  -F fieldNameHere=@myfile.html  http://myapi.com/

-F(根据注释)隐含了 -X POST,引号可选

curl -F "fieldNameHere=@myfile.html"  http://myapi.com/

但是那里有多余的“-X POST”,不会得到额外的奖励点... =) - Daniel Stenberg
2
哦,哇,问题就在于我漏掉了一个@符号。太棒了...谢谢你。我想这告诉curl这是一个实际文件的名称? - Stephen
2
是的,基本上是这样。 - Scriptonomy

7

对于更为复杂的请求:

curl
 -X POST "YOUR_API_URL"
 -H "Authorization: Bearer YOUR_TOKEN"
 -H "Accept: application/json"
 -H "Content-Type: multipart/form-data"
 -F "meta={\"YOUR_ATTRIBUTE\": \"YOUR_DATA\"};type=application/json"
 -F "text=PATH_TO_FILE;type=text/plain"

你可以将多个块组合成一个请求。了解更多信息,请访问:https://learn.microsoft.com/en-us/azure/digital-twins/how-to-add-blobs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接