8

試圖簡單地上傳視頻使用Google API PHP Client (latest release 1.1.6),但code in Youtube API V3不工作,並給500內部服務器錯誤。如何使用Google API PHP Client Library和Youtube API V3將視頻上傳到YouTube?

當我沒有使用任何流血的beta版本時,下面的代碼有什麼問題,我剛剛屏蔽了3個參數,否則它被複製爲Youtube API V3。發生

require_once 'google-api-php-client/src/Google/Client.php'; 
    require_once 'google-api-php-client/src/Google/Service/YouTube.php'; 

    session_start(); 

    $OAUTH2_CLIENT_ID = 'CHANGE1-0osfh0p5h80o9ol2uqtsjq5i7r1jun.apps.googleusercontent.com'; 
    $OAUTH2_CLIENT_SECRET = 'CHANGE2azMpt__VdSt9'; 

    $client = new Google_Client(); 
    $client->setClientId($OAUTH2_CLIENT_ID); 
    $client->setClientSecret($OAUTH2_CLIENT_SECRET); 
    $client->setScopes('https://www.googleapis.com/auth/youtube'); 
    $redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], 
     FILTER_SANITIZE_URL); 
    $client->setRedirectUri($redirect); 

    // Define an object that will be used to make all API requests. 
    $youtube = new Google_Service_YouTube($client); 

    if (isset($_GET['code'])) { 
    if (strval($_SESSION['state']) !== strval($_GET['state'])) { 
     die('The session state did not match.'); 
    } 

    $client->authenticate($_GET['code']); 
    $_SESSION['token'] = $client->getAccessToken(); 
    header('Location: ' . $redirect); 
    } 

    if (isset($_SESSION['token'])) { 
    $client->setAccessToken($_SESSION['token']); 
    } 

    // Check to ensure that the access token was successfully acquired. 
    if ($client->getAccessToken()) { 
    try{ 
     // REPLACE this value with the path to the file you are uploading. 
     $videoPath = "/CHANGE3/videos/test.mp4"; 

     // Create a snippet with title, description, tags and category ID 
     // Create an asset resource and set its snippet metadata and type. 
     // This example sets the video's title, description, keyword tags, and 
     // video category. 
     $snippet = new Google_Service_YouTube_VideoSnippet(); 
     $snippet->setTitle("Test title"); 
     $snippet->setDescription("Test description"); 
     $snippet->setTags(array("tag1", "tag2")); 

     // Numeric video category. See 
     // https://developers.google.com/youtube/v3/docs/videoCategories/list 
     $snippet->setCategoryId("22"); 

     // Set the video's status to "public". Valid statuses are "public", 
     // "private" and "unlisted". 
     $status = new Google_Service_YouTube_VideoStatus(); 
     $status->privacyStatus = "public"; 

     // Associate the snippet and status objects with a new video resource. 
     $video = new Google_Service_YouTube_Video(); 
     $video->setSnippet($snippet); 
     $video->setStatus($status); 

     // Specify the size of each chunk of data, in bytes. Set a higher value for 
     // reliable connection as fewer chunks lead to faster uploads. Set a lower 
     // value for better recovery on less reliable connections. 
     $chunkSizeBytes = 1 * 1024 * 1024; 

     // Setting the defer flag to true tells the client to return a request which can be called 
     // with ->execute(); instead of making the API call immediately. 
     $client->setDefer(true); 

     // Create a request for the API's videos.insert method to create and upload the video. 
     $insertRequest = $youtube->videos->insert("status,snippet", $video); 

     // Create a MediaFileUpload object for resumable uploads. 
     $media = new Google_Http_MediaFileUpload(
      $client, 
      $insertRequest, 
      'video/*', 
      null, 
      true, 
      $chunkSizeBytes 
    ); 
     $media->setFileSize(filesize($videoPath)); 


     // Read the media file and upload it chunk by chunk. 
     $status = false; 
     $handle = fopen($videoPath, "rb"); 
     while (!$status && !feof($handle)) { 
     $chunk = fread($handle, $chunkSizeBytes); 
     $status = $media->nextChunk($chunk); 
     } 

     fclose($handle); 

     // If you want to make other calls after the file upload, set setDefer back to false 
     $client->setDefer(false); 


     $htmlBody .= "<h3>Video Uploaded</h3><ul>"; 
     $htmlBody .= sprintf('<li>%s (%s)</li>', 
      $status['snippet']['title'], 
      $status['id']); 

     $htmlBody .= '</ul>'; 

    } catch (Google_Service_Exception $e) { 
     $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', 
      htmlspecialchars($e->getMessage())); 
    } catch (Google_Exception $e) { 
     $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', 
      htmlspecialchars($e->getMessage())); 
    } 

    $_SESSION['token'] = $client->getAccessToken(); 
    } else { 
    // If the user hasn't authorized the app, initiate the OAuth flow 
    $state = mt_rand(); 
    $client->setState($state); 
    $_SESSION['state'] = $state; 

    $authUrl = $client->createAuthUrl(); 
    $htmlBody = <<<END 
    <h3>Authorization Required</h3> 
    <p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p> 
    END; 
    } 
    echo $htmlBody; 

服務錯誤:Error calling PUT https://www.googleapis.com/upload/youtube/v3/videos?part=status%2Csnippet&uploadType=resumable&upload_id=AEnB2UpXd4UQ0dt-v2_8YLzDp4KAywZQUIgUEm3Lxyv7nV_ZLAHghu6RiNE0e82xMMGx9ztQvTdYGFwvSNP5yJiOdffS0CuG-Q: (400) Failed to parse Content-Range header.

不要將其標記下方複製的非常古老和過時的問題,因爲你可以看到其他的問題,甚至包括在他們的代碼中不存在的文件在最新的Google API PHP Client圖書館或指的是谷歌代碼項目。類似的過時問題12345

+0

你有沒有注意到這一點? https://developers.google.com/youtube/v3/code_samples/php – Mijago

+0

是的我上面的代碼是完全相同的代碼,但它給出了錯誤 – XIMRX

回答

5

奇怪的代碼非常小的調整,解決了這個問題。

而不是僅僅使用$videoPath = "/path/to/file.mp4";使用DOCUMENT_ROOT解決了這個問題。除了那些文檔代碼是完美的。

$videoPath = $_SERVER["DOCUMENT_ROOT"] . "/mapapp/videos/test.mp4"; 
+0

這個'YouTube.php'文件在哪裏?我無法在git中找到它! – Jackson

0

其他whoe惡有惡報和處理「無法解析內容Range頭」

我正在尋找3天,finaly我發現我的解決方案...

我的文件是在Windows(我的網絡服務器工具)上大於4GB和XAMPP只有32位,所以fopen()命令無法讀取我的大文件。

我installaed apache的64位和64位PHP7通過我自己的,它走了

這時我的劇本finaly上裝載大文件

794 - 07:14:15 - 832569344 
795 - 07:14:16 - 833617920 
796 - 07:14:17 - 834666496 
797 - 07:14:18 - 835715072 
798 - 07:14:19 - 836763648 
799 - 07:14:19 - 837812224 
800 - 07:14:20 - 838860800 
801 - 07:14:21 - 839909376 
802 - 07:14:22 - 840957952 
803 - 07:14:23 - 842006528 
804 - 07:14:24 - 843055104 

媒體鏈接804塊^^沒有截斷nothign塊:d只是上傳無瑕

相關問題