在同一请求中调整 multipart/form-data 请求以使用图像和 json 进行卷曲

Adapt multipart/form-data request to curl with image and json in the same request

我需要重写这个从浏览器中提取的 curl 请求以从 bash 执行它,它是一个 multipart/form-data 将图像的上传与 json 结合在一起同样的请求,我已经进行了几次测试,用两个 -F 替换原始数据,但服务器响应错误。 正确的方法是什么? 我也无法理解 WebKitFormBoundary 旁边的键是一个看起来随机的值,它只是一个分隔符吗?我可以使用任何东西吗?

我删除了我认为不相关的headers

curl 'https://localhost' \
  -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXXXXXXXXXXXXXXXX' 
  -H 'Accept: */*' \
  --data-raw $'------WebKitFormBoundaryXXXXXXXXXXXXXXXX\r\nContent-Disposition: form-data; name="image"; filename="image.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundaryXXXXXXXXXXXXXXXX\r\nContent-Disposition: form-data; name="item"; filename="blob"\r\nContent-Type: application/json\r\n\r\n{"item1":"xxxx","item2":"yyyy"}\r\n------WebKitFormBoundaryXXXXXXXXXXXXXXXX--\r\n' \

谢谢

I also fail to understand the key that is next to WebKitFormBoundary is a value that seems random, is it just a separator? can i use anything?

是的,是的,实际上是的。它应该是一个 random-guaranteed-unique 字符串,用作分隔符来表示表格的开始和结束。如果您事先知道 none 的上传内容包含字符串 Whosebug,您可以使用 Content-Type: multipart/form-data; boundary=Whosebug 例如(但如果你上传的文件实际上包含字符串 Whosebug ,这可能会中断!),但你应该让 curl 自动生成该字符串,而不是你自己指定它,curl 将 auto-generate一个几乎保证唯一的字符串。

I have removed the headers that I considered irrelevant

... 如果您猜错了,服务器可能会报错,因为您错过了必需的 header。假设您在删除 irrelevant headers 时没有犯任何错误,但我认为它是

curl 'https://localhost'\
  --form "image=@image.jpg;type=image/jpeg"\
  --form "item=@blob;type=application/json"

该命令生成的请求是错误的:

POST / HTTP/1.1
Host: localhost
User-Agent: curl/7.81.0
Accept: */*
Content-Length: 359
Content-Type: multipart/form-data; boundary=------------------------7d0262831ce8f248

--------------------------7d0262831ce8f248
Content-Disposition: form-data; name="image"; filename="image.jpg"
Content-Type: image/jpeg

image.jpg content

--------------------------7d0262831ce8f248
Content-Disposition: form-data; name="item"; filename="blob"
Content-Type: application/json

["json lol"]

--------------------------7d0262831ce8f248--

上面可以看到,反正Accept: */*是curl默认的accept-header,所以不用指定,curl auto-generated边界------------------------7d0262831ce8f248所以也不需要手动指定边界。