2017-04-14 3 views
0

ich das PHP-Code-Beispiel verwenden für ein Video von youtube bereitgestellt hochladen, die hier gefunden werden kann: https://developers.google.com/youtube/v3/code_samples/php#upload_a_videoPHP Youtube API Video-Upload-Code-Beispiel Uploads zweimal

Wenn jedoch die Sitzung beginnt, es muss den Benutzer zu autorisieren Sie es, so dass Sie auf die Autorisierungsseite gelangen und Sie dann zurückleiten. Wenn ich dies tue, wird es zweimal hochgeladen. Ich nehme an, dass es versucht, das Video hochzuladen, das es nicht tun konnte, wenn es nicht autorisiert war. Es wird nur beim Hochladen doppelt hochgeladen, und nicht wenn die Seite neu geladen wird und die Sitzung noch gültig ist.

Wie kann ich diesen anfänglichen Duplikat-Upload stoppen?

+0

haben Sie zuerst sichergestellt, dass Ihre '$ OAUTH2_CLIENT_ID' und' $ OAUTH2_CLIENT_SECRET' gesetzt, gültig und von der Google API erkannt wurden? – OldPadawan

+0

ja .... wenn sie nicht wären, wie würde das Video an erster Stelle hochgeladen ??? –

+0

Ich ging nicht durch alle Google API :), nur die Überprüfung wurde nicht in die Warteschleife gesetzt, während Sie autorisieren, dann könnte es zweimal hochladen ... – OldPadawan

Antwort

0

können Sie den folgenden Code verwenden, um die Datei laden nur nach Benutzer signin hat, wenn der Benutzer eine Schaltfläche mit dem in einer Texteingabe definierten Pfad einreichen klicken:

<?php 
/** 
* Library Requirements 
* 
* 1. Install composer (https://getcomposer.org) 
* 2. On the command line, change to this directory (api-samples/php) 
* 3. Require the google/apiclient library 
* $ composer require google/apiclient:~2.0 
*/ 
if (!file_exists(__DIR__ . '/vendor/autoload.php')) { 
    throw new \Exception('please run "composer require google/apiclient:~2.0" in "' . __DIR__ .'"'); 
} 
require_once __DIR__ . '/vendor/autoload.php'; 
session_start(); 

$response = ""; 

/* 
* You can acquire an OAuth 2.0 client ID and client secret from the 
* {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}> 
* For more information about using OAuth 2.0 to access Google APIs, please see: 
* <https://developers.google.com/youtube/v3/guides/authentication> 
* Please ensure that you have enabled the YouTube Data API for your project. 
*/ 
$OAUTH2_CLIENT_ID = 'YOUR_CLIENTID'; 
$OAUTH2_CLIENT_SECRET = 'YOUR_CLIENT_SECRET'; 

$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); 
// Check if an auth token exists for the required scopes 
$tokenSessionKey = 'token-' . $client->prepareScopes(); 
if (isset($_GET['code'])) { 
    if (strval($_SESSION['state']) !== strval($_GET['state'])) { 
    die('The session state did not match.'); 
    } 
    $client->authenticate($_GET['code']); 
    $_SESSION[$tokenSessionKey] = $client->getAccessToken(); 
    header('Location: ' . $redirect); 
} 
if (isset($_SESSION[$tokenSessionKey])) { 
    $client->setAccessToken($_SESSION[$tokenSessionKey]); 
} 
// Check to ensure that the access token was successfully acquired. 

if ($client->getAccessToken()) { 
    try { 

    $videoPath = ""; 

    if (isset($_GET['videoPath'])){ 
    $videoPath = $_GET['videoPath']; 
    } 
    else if(isset($_SESSION['videoPath'])){ 
     $videoPath = $_SESSION['videoPath']; 
    } 

    if(isset($videoPath) && !isset($_GET['state']) && file_exists($videoPath)) { 

     // 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 = "private"; 

     // 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); 

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

     $response .= '</ul>'; 

     $_SESSION['path'] = ""; 
    } 
    else{ 
    $response = "no path was specified or file doesn't exist"; 
    file_put_contents('php://stderr', print_r("no path was specified or file doesn't exist", TRUE)); 
    } 

    } catch (Google_Service_Exception $e) { 
    $response = htmlspecialchars($e->getMessage()); 
    } catch (Google_Exception $e) { 
    $response = htmlspecialchars($e->getMessage()); 
    } 
    $_SESSION[$tokenSessionKey] = $client->getAccessToken(); 
} else { 

    if(isset($_GET['videoPath'])){ 

    $_SESSION["videoPath"] = $_GET['videoPath']; 

    // If the user hasn't authorized the app, initiate the OAuth flow 
    $state = mt_rand(); 
    $client->setState($state); 
    $_SESSION['state'] = $state; 
    $authUrl = $client->createAuthUrl(); 
    header('Location: ' . $authUrl); 
    } 
} 
?> 

<!doctype html> 
<html> 
<head> 
<title>Upload Video</title> 
</head> 
<body> 
    <div> 
     <form id="form" action="resumable_upload.php""> 

      <label>Enter the path to the video to upload 
      : 
       <input id="video-path" name="videoPath" value='/path/to/video' type="text" /> 
      </label> 
      <input name="action" type="submit" value="Upload video" /> 
     </form> 
     <div id="playlist-container"> 
      <?php echo $response ?> 
     </div> 
    </div> 
</body> 
</html> 

Aber wenn die Seite bekommt aktualisieren oder wenn die Der Nutzer klickt versehentlich erneut auf den Button, um das Video erneut hochzuladen. Überprüfen Sie this post, um mit dem doppelten Video-Problem umzugehen

Verwandte Themen