28

我正在尝试使用 curl 批量上传到 YouTube,遵循此处的 API 规范;简而言之,它需要一个多部分的 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 拒绝处理视频。

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

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

4

1 回答 1

47

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

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

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

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

于 2012-11-21T10:55:04.167 回答