9

PHP curl を使用しているサーバーから Youtube にビデオを直接アップロードしたいと考えています。

このリクエスト形式が必要です:

POST /feeds/api/users/default/uploads HTTP/1.1
Host: uploads.gdata.youtube.com
Authorization: Bearer ACCESS_TOKEN
GData-Version: 2
X-GData-Key: key=adf15ee97731bca89da876c...a8dc
Slug: video-test.mp4
Content-Type: multipart/related; boundary="f93dcbA3"
Content-Length: 1941255
Connection: close

--f93dcbA3
Content-Type: application/atom+xml; charset=UTF-8

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom"
  xmlns:media="http://search.yahoo.com/mrss/"
  xmlns:yt="http://gdata.youtube.com/schemas/2007">
  <media:group>
    <media:title type="plain">Bad Wedding Toast</media:title>
    <media:description type="plain">
      I gave a bad toast at my friend's wedding.
    </media:description>
    <media:category
      scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People
    </media:category>
    <media:keywords>toast, wedding</media:keywords>
  </media:group>
</entry>
--f93dcbA3
Content-Type: video/mp4
Content-Transfer-Encoding: binary

<Binary File Data>
--f93dcbA3--

これは私が持っているものです:

$content = $this->buildRequestContent();

$ch = curl_init();

$curlConfig = array(
    CURLOPT_URL => 'http://uploads.gdata.youtube.com/feeds/api/users/default/uploads',
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_BINARYTRANSFER => true,
    CURLOPT_POSTFIELDS => $content,
    CURLOPT_HTTPHEADER, array(
        "Authorization" => sprintf("GoogleLogin auth=%s", $this->accessToken),
        "GData-Version" => 2,
        "X-GData-Key" => sprintf("key=%s", $this->developerKey),
        "Slug" => sprintf("%s", $this->video->getFilename()),
        "Content-Type" => sprintf("multipart/related; boundary=\"%s\"", $this->boundaryString),
        "Content-Length" => strlen($content),
        "Connection" => "close"
    ),
);

curl_setopt_array($ch, $curlConfig);

$result = curl_exec($ch);

結果をダンプすると、curl が を に変更したことがわかりますが、Content-Typeこれapplication/x-www-form-urlencodedはもちろん youtube ではサポートされていません。

バイナリ コンテンツ (ビデオ) を に入れましたCURLOPT_POSTFIELDS。これは間違っている可能性がありますが、それ以外のリクエスト ボディを設定する方法がわかりません。

では、設定した Content-Type を保持するにはどうすればよいでしょうか?

4

2 に答える 2

12

受け入れられた回答は役に立ちませんでした。コードに別の問題が見つかりました。現在の PHPドキュメントによると、CURLOPT_HTTPHEADER は次のように設定する必要があります。

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-type: text/plain',
    'Content-length: 100'
));

のようなハッシュではなく、文字列のリストでなければなりませんarray('Content-Type' => 'text/plain')。誰かのデバッグ時間を節約できることを願っています。

于 2013-12-13T12:25:26.167 に答える
8

オプションのパラメータ設定に関するドキュメント セクションによると、HTTP メソッドはPOSTデフォルトでコンテンツ タイプが に設定されapplication/x-www-form-urlencodedます。したがって、すべてのオプションを一度に設定すると、Content-Type上書きされるのではないかと思います。
私の提案は、メソッドを設定した後、単一のステートメントでコンテンツタイプを設定することです。

$curlConfig = array(
    CURLOPT_URL => 'http://uploads.gdata.youtube.com/feeds/api/users/default/uploads',
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_BINARYTRANSFER => true,
    CURLOPT_POSTFIELDS => $content,
);

curl_setopt_array($ch, $curlConfig);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: ' . sprintf('GoogleLogin auth=%s', $this->accessToken),
    'GData-Version: 2',
    'X-GData-Key: ' . sprintf('key=%s', $this->developerKey),
    'Slug: ' . sprintf('%s', $this->video->getFilename()),
    'Content-Type: ' . sprintf('multipart/related; boundary="%s"',
                                  $this->boundaryString),
    'Content-Length: ' . strlen($content),
    'Connection: close'
));
于 2013-04-19T10:46:01.617 に答える