curl:多部分 POST 的每个文件内容类型(YouTube API)

Posted

技术标签:

【中文标题】curl:多部分 POST 的每个文件内容类型(YouTube API)【英文标题】:curl: Per-file Content-Type for multipart POST (YouTube API) 【发布时间】:2012-11-09 04:27:26 【问题描述】:

我正在尝试使用 curl 批量上传到 YouTube,遵循 API 规范 here;简而言之,它需要一个多部分的 POST 请求,元数据为 XML 格式,Content-Type 为application/atom+xml; charset=UTF-8,然后是视频数据本身。

我当前的命令行(从 upl.xml 获取元数据,从 upl.mkv 获取视频)看起来像这样:

curl -s -F "file=@upl.xml" -F "file=@upl.mkv" -H 'GData-Version: 2' -H 'Authorization: GoogleLogin auth=<AUTH>' -H 'Slug: upl.mkv' -H 'X-GData-Key: key=<KEY>' http://uploads.gdata.youtube.com/feeds/api/users/default/uploads

当我检查使用--trace 发送的实际请求时,看起来两个文件都以正确的顺序发送,但元数据的 Content-Type 设置为 application/octet-stream;上传按预期完成,但 YouTube 拒绝处理视频。

如果我尝试使用 --data--data-ascii--form-string 等提交 upl.xml。我只会收到各种各样的其他错误,这让我相信这是由于内容类型不正确造成的。如果我忽略元数据并只发送视频文件,它可以正常工作,但不幸的是这并不能解决我的问题。

我是否在这里遗漏了什么,如果没有,是否可以在不破坏 libcurl 的情况下做到这一点?

【问题讨论】:

【参考方案1】:

首先,您可以通过添加“;type=magic/string”为您上传的部分指定内容类型。例如在您的视频案例中:

curl -F "file=@upl.mpeg4;type=video/mpeg4" [网址]

(使用 --trace 或 --trace-ascii 来验证 curl 是否准确发送了您想要的内容)

...但是这就是说,我猜接收服务器实际上不太可能关心客户端声称的内容类型是什么。这意味着我认为您的问题的根源实际上根本不是内容类型。

【讨论】:

以上是关于curl:多部分 POST 的每个文件内容类型(YouTube API)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Postman Chrome 扩展发送多部分/混合内容

curl 形式的 http post 方法的默认标头内容类型是啥? [复制]

带有多部分请求的 Spring Boot 不受支持的媒体类型

curl -O命令作用是啥?

如果“内容类型”:“多部分/表单数据”,CORS 问题

提供的“HttpContent”实例无效。它没有带有“边界”参数的“多部分”内容类型标头