如何使用curl使用“上传一个图像文件”;内容类型:多部分/相关“;

如何使用curl使用“上传一个图像文件”;内容类型:多部分/相关“;,curl,Curl,curl--trace trace.txt-X POST-H'内容类型:multipart/related;boundary=boundary_1234'--数据二进制$'--boundary_1234\r\n内容类型:application/json;charset=UTF-8\r\n\r\n{\r\n\t“title”:“TestFile”\r\n}\r\n\r\n--boundary\u 1234\r\n内容类型:image/jpeg\r\n\r\n'--data binary'@Imag

curl--trace trace.txt-X POST-H'内容类型:multipart/related;boundary=boundary_1234'--数据二进制$'--boundary_1234\r\n内容类型:application/json;charset=UTF-8\r\n\r\n{\r\n\t“title”:“TestFile”\r\n}\r\n\r\n--boundary\u 1234\r\n内容类型:image/jpeg\r\n\r\n'--data binary'@Image0177.jpg'--data binary$'\r\n--boundary\r\u 1234--\r\n'-localhost:3000/google upload/drive/v2 files?uploadType=multipart


它没有成功,
image0177.jpg
size
17k
,但是上传谷歌硬盘是
6bit
,为什么?

更新:有人指出我没有正确阅读我以前的答案中的问题。用于
multipart/form data
而不是
multipart/related

事实上,curl没有一种方便的方式来发送我能想到的多部分/相关流。你真的确定这就是你想要发送的吗


使用命令行时,整个传输都记录在“trace.txt”中。这有助于你找出问题所在吗?

我知道这是一篇很老的帖子,但我在尝试将Google Drive API与curl结合使用时遇到了同样的问题,并最终找到了解决方案,但使用起来有点棘手,特别是在内容长度计算方面,所以我会留下一个回复,以防它对其他人有所帮助

根据google文档,首先,您应该在主请求中包含内容类型、内容长度和授权头。对于内容长度,您可以让curl自动计算,因此添加其他标题,如下所示:

-H "Content-Type: multipart/related; boundary=287032381131322"
-H "Authorization: Bearer <Your Oauth2 Access Token>"
然后是元数据内容:

{\"name\":\"Test\"}
下一节是二进制数据的边界起点,它必须再次包含边界分隔符和内容类型标题:

--287032381131322
Content-Type: application/json; charset=UTF-8
--287032381131322
Content-Type: application/octet-stream
然后是要上载的二进制数据,其传递方式如下:

--data-binary @file.ext
最后,您应该包括一个用于关闭边界分隔符的新部分:

--287032381131322--
在我的示例中,使用5679字节的文件,这将是来自google的完整命令和回复:

curl -v -H "Content-Type: multipart/related; boundary=287032381131322"      \
    -H "Authorization: Bearer <My Oauth2 Access Token>"                   \
    --data-binary $'--287032381131322\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{\"name\":\"Test\"}\r\n--287032381131322\r\nContent-Type: application/octet-stream\r\n\r\n' \
    --data-binary @b0c11d3b40b71ed08108e5dad7f6ecee-0                       \
    --data-binary $'\r\n--287032381131322--'                                \
    "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"

> POST /upload/drive/v3/files?uploadType=multipart HTTP/1.1
> Host: www.googleapis.com
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Type: multipart/related; boundary=287032381131322
> Authorization: Bearer <My Oauth2 Access Token>
> Content-Length: 5848
> Expect: 100-continue
> 
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< X-GUploader-UploadID:  <My Uploader ID>
< Vary: Origin
< Vary: X-Origin
< Content-Type: application/json; charset=UTF-8
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: Mon, 01 Jan 1990 00:00:00 GMT
< Date: Mon, 24 Jul 2017 20:56:50 GMT
< Content-Length: 123
< Server: UploadServer
< Alt-Svc: quic=":443"; ma=2592000; v="39,38,37,36,35"
< 
{
 "kind": "drive#file",
 "id": "0B-4U01-IEMlATjdfbVNqQURiN0U",
 "name": "Test",
 "mimeType": "application/octet-stream"
}
* Connection #0 to host www.googleapis.com left intact
curl-v-H“内容类型:多部分/相关;边界=287032381131322”\
-H“授权:持票人”\
--数据二进制$'--287032381131322\r\n内容类型:application/json;charset=UTF-8\r\n\r\n{“name\”:“Test\”}\r\n--287032381131322\r\n内容类型:应用程序/八位字节流\r\n\r\n\
--数据二进制@b0c11d3b40b71ed08108e5dad7f6ecee-0\
--数据二进制$'\r\n--287032381131322--'\
"https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"
>POST/upload/drive/v3/files?uploadType=多部分HTTP/1.1
>主持人:www.googleapis.com
>用户代理:curl/7.47.0
>接受:*/*
>内容类型:多部分/相关;边界=287032381131322
>授权:持票人
>内容长度:5848
>预期:100人继续
> 
不成功,我使用此代码,但不成功。为什么?服务器是google drive,-F选项显式用于
multipart/form data
,其中OP要求
multipart/related
。(谷歌硬盘要求提供
多部分/相关的