【问题标题】:How to use curl upload one image file using "Content-Type: multipart/related"如何使用 curl 使用“Content-Type:multipart/related”上传一个图像文件
【发布时间】:2014-11-17 03:11:00
【问题描述】:

curl --trace trace.txt -X POST -H 'Content-Type: multipart/related;边界=边界_1234'--data-binary $'--边界_1234\r\n内容类型:应用程序/json; charset=UTF-8\r\n\r\n{\r\n\t"title": "TestFile"\r\n}\r\n\r\n--boundary_1234\r\nContent-Type:图像/jpeg\r\n\r\n' --data-binary '@Image0177.jpg' --data-binary $'\r\n--boundary_1234--\r\n' 'localhost:3000/google /upload/drive/v2/files?uploadType=multipart

不成功,image0177.jpg size 17k,但是上传google drive是6bit,为什么?

【问题讨论】:

    标签: curl


    【解决方案1】:

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

    根据 google 文档,首先,您应该在主请求中包含 Content-Type、Content-Length 和 Authorization 标头。对于 Content-Length,你可以让 curl 自动计算它,所以像这样添加其他标题:

    -H "Content-Type: multipart/related; boundary=287032381131322"
    -H "Authorization: Bearer <Your Oauth2 Access Token>"
    

    其次,您需要在元数据中包含一个多部分部分。这部分需要从边界开始,后面是 Content-Type 头:

    --287032381131322
    Content-Type: application/json; charset=UTF-8
    

    后面是您的元数据内容:

    {\"name\":\"Test\"}
    

    下一部分,是二进制数据的边界开始,它必须再次包含边界分隔符和 Content-Type 标头:

    --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--data/--data-binary 值之间插入 & 符号 (&amp;)。所以在文件内容之前有一个,在它之后有一个。
    【解决方案2】:

    更新:有人指出我没有正确阅读我之前回答的问题。 curl -F 代表 multipart/form-data 代表 multipart/related

    事实上,curl 没有我能想到的方便的方法来发送多部分/相关流。您确定这是您要发送的内容吗?

    当您使用命令行时,您会将整个传输记录在“trace.txt”中。这不是帮助您找出问题所在吗?

    【讨论】:

    • 不成功,我使用这个代码,但不成功。为什么?服务器是谷歌驱动器。
    • -F 选项明确用于multipart/form-data,其中 OP 要求multipart/related。 (谷歌驱动器要求multipart/related
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2015-02-14
    • 2017-11-12
    • 2011-10-23
    • 1970-01-01
    • 2015-05-14
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多