28

こちらのAPI仕様に従って、curlを使用してYouTubeにバッチアップロードしようとしています。つまり、XML形式のメタデータとContent-Typeがapplication/atom+xml; charset=UTF-8、その後にビデオデータ自体が続くマルチパートPOSTリクエストが必要です。

私の現在のコマンドライン(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、などを使用してupl.xmlを送信しようとすると--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 に答える