Tutorial: How to Use Youtube API to Upload Video in PHP

Upload Video in PHP

Youtube is one of the most popular video-sharing site and everybody knows it. But what if you can upload video in PHP directly from your site? The Youtube API allows developers to integrate functionality of uploading video directly through your PHP website. And using Youtube API to upload video in PHP can display video at web application by the Youtube video ID. This will reduce the server space, and offer a simple way for playing videos directly on website.

In this PHP tutorial, we’ll discuss how to develop PHP scripts to upload video in PHP using Youtube API.

In order to develop this demo, we’ll need following.

  1. Database
  2. JS
  3. CSS
  4. CODE
  5. Includes
  6. Src

First, let’s start with the Database.

Login with your phpmyadmin – http://localhost/phpmyadmin

Find create button, and create a new database.

Now click on import button and select youtube_video.sql file.

Once the database is imported successfully, next step is to put CSS and JS file into project directory.

We’ll start with following Code Structure.

  1. Index.php
  2. Config.php
  3. Logout.php

Creating Youtube API Key to Upload Video in PHP

Go to Google developers console – https://console.developers.google.com/

Create a new project by clicking on Create Project button.

In the project name field, type the name of your project.
In project ID field, the console will provide a project ID. However, the project ID must be unique.

Now hit Create button.

Once you create project successfully, find APIs tab in the sidebar. Here, a list of Google API will appear.

Find the Google+API service and set its status to Enable.

Also find the Youtube Data API service and set its status to Enable.

Now go to Credentials under APIs & auth section.

Create a new Client ID.

A dialog box will appear to choose application type. Select Web Application and click on Configure consent screen button.

Next, Choose email address and enter product name.

In the Authorized Javascript origins field, enter your app origin to allow it to run on protocols, subdomains, and domains.

Now in the Authorized Redirect URL field, enter your redirect URL.

At last, click on Create Client ID.

Start Code Integration



if(session_id() != '') session_destroy(); 


if($_GET['err'] == 'bf'){ 

$errorMsg = 'Please select a video file for upload.'; 

}elseif($_GET['err'] == 'ue'){ 

$errorMsg = 'Sorry, there was an error uploading your file.'; 

}elseif($_GET['err'] == 'fe'){ 

$errorMsg = 'Sorry, only MP4, AVI, MPEG, MPG, MOV & WMV files are allowed.'; 


$errorMsg = 'Some problems occured, please try again.'; 




<!DOCTYPE html> 



<title>SPACE-O :: Youtube upload</title> 

<link rel="stylesheet" type="text/css" href="css/style.css"/> 



<div class="youtube-box"> 

<h1>Upload video to YouTube using PHP</h1> 

<form method="post" name="multiple_upload_form" id="multiple_upload_form" enctype="multipart/form-data" action="youtube_upload.php"> 

<?php echo (!empty($errorMsg))?'<p class="err-msg">'.$errorMsg.'</p>':''; ?> 

<label for="title">Title:</label><input type="text" name="title" id="title" value="" /> 

<label for="description">Description:</label> <textarea name="description" id="description" cols="20" rows="2" ></textarea> 

<label for="tags">Tags:</label> <input type="text" name="tags" id="tags" value="" /> 

<label for="video_file">Choose Video File:</label> <input type="file" name="videoFile" id="videoFile" > 

<input name="videoSubmit" id="submit" type="submit" value="Upload"> 






define('HOST', 'localhost'); 

define('USERNAME', '{USERNAME}'); 

define('PASSWORD', '{PASSWORD}'); 

define('DATABASE_NAME', 'youtube_video'); 

//Connect and select the database 


if ($db->connect_error) { 

    die("Connection failed: " . $db->connect_error); 


NOTE: change value of HOST , USERNAME , PASSWORD , DATABASE_NAME after change run your DB.php file in browser. If you got any error then you may put value wrong.



    // OAUTH Configuration 

    $oauthClientID = '{ClientID}'; 

    $oauthClientSecret = '{Scereat Key}'; 

    $baseUri = 'http://localhost/DEMO/youtube_demo/'; 

    $redirectUri =$baseUri.'/youtube_upload.php'; 







    // Include google client libraries 

    require_once 'src/autoload.php'; 

    require_once 'src/Client.php'; 

    require_once 'src/Service/YouTube.php'; 



    $client = new Google_Client(); 





    $youtube = new Google_Service_YouTube($client); 





require_once 'config.php'; 

require_once 'includes/DB.php'; 

// create an object of class DB. 

$db = new DB; 


$videoTitle = $_REQUEST['title']; 

$videoDesc = $_REQUEST['description']; 

$videoTags = $_REQUEST['tags']; 

if($_FILES["videoFile"]["name"] != ''){ 

    $fileSize = $_FILES['videoFile']['size']; 

    $fileType = $_FILES['videoFile']['type']; 

    $fileName = str_shuffle('nityanandamaity').'-'.basename($_FILES["videoFile"]["name"]); 

$targetDir = "videos/"; 

$targetFile = $targetDir . $fileName; 

$allowedTypeArr = array("video/mp4", "video/avi", "video/mpeg", "video/mpg", "video/mov", "video/wmv", "video/rm"); 

if(in_array($fileType, $allowedTypeArr)) { 

    if(move_uploaded_file($_FILES['videoFile']['tmp_name'], $targetFile)) { 

        $videoFilePath = $targetFile; 









// insert video data 







// get last video data 

$result = $db->getLastRow(); 


 * You can acquire an OAuth 2.0 client ID and client secret from the 

 * Google Developers Console <https://console.developers.google.com/> 

 * 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. 


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

if (strval($_SESSION['state']) !== strval($_GET['state'])) { 

  die('The session state did not match.'); 



$_SESSION['token'] = $client->getAccessToken(); 

header('Location: ' . REDIRECT_URI); 


if (isset($_SESSION['token'])) { 



$htmlBody = ''; 

// Check to ensure that the access token was successfully acquired. 

if ($client->getAccessToken()) { 


    // REPLACE this value with the path to the file you are uploading. 

    $videoPath = $result['video_path']; 

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




    // Numeric video category. See 

    // https://developers.google.com/youtube/v3/docs/videoCategories/list 


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



    // 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. 


    // 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( 









    // Read the media file and upload it. 

    $status = false; 

    $handle = fopen($videoPath, "rb"); 

    while (!$status && !feof($handle)) { 

      $chunk = fread($handle, $chunkSizeBytes); 

      $status = $media->nextChunk($chunk); 



    // If you want to make other calls after the file upload, set setDefer back to false 


// Update youtube video ID to database 


// delete video file from local folder 


    $htmlBody .= "<p class='succ-msg'>Video have been uploaded successfully.</p><ul>"; 

$htmlBody .= '<embed width="400" height="315" src="https://www.youtube.com/embed/'.$status['id'].'"></embed>'; 

$htmlBody .= '<li><b>Title: </b>'.$status['snippet']['title'].'</li>'; 

$htmlBody .= '<li><b>Description: </b>'.$status['snippet']['description'].'</li>'; 

$htmlBody .= '<li><b>Tags: </b>'.implode(",",$status['snippet']['tags']).'</li>'; 

    $htmlBody .= '</ul>'; 

$htmlBody .= '<a href="logout.php">Logout</a>'; 

  } catch (Google_ServiceException $e) { 

    $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', 


  } catch (Google_Exception $e) { 

    $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', htmlspecialchars($e->getMessage())); 

$htmlBody .= 'Please reset session <a href="logout.php">Logout</a>'; 



  $_SESSION['token'] = $client->getAccessToken(); 

} else { 

// If the user hasn't authorized the app, initiate the OAuth flow 

$state = mt_rand(); 


$_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> 




<!DOCTYPE html> 



<title>SPACE-O :: Youtube upload</title> 

<link rel="stylesheet" type="text/css" href="css/style.css"/> 



<div class="youtube-box"> 

<h1>Upload video to YouTube using PHP</h1> 

<div class="video-up"><a href="<?php echo BASE_URI; ?>">New Upload</a></div> 

<div class="content"> 

<?php echo $htmlBody; ?> 






And Done!

This was just a simple feature. It’s also possible to include additional features like creating playlist, receiving subscription notifications, etc to implement in PHP website. However, if you’re not a technical person, then it’s better that you hire PHP developer to implement Youtube API feature in your website.

Grab a free copy of PHP Video Upload Demo from Github.

Also Read:

This page was last edited on April 28th, 2020, at 9:47.


Have an App Idea?

Get your free consultation now

14 thoughts on “Tutorial: How to Use Youtube API to Upload Video in PHP

  1. Dilip

    I have tried a lot. But its not worked. you are not creating a complete demo.
    Errors are like following

    Upload video to YouTube using PHP

    New Upload
    Authorization Required

    You need to authorize access before proceeding.

    1. Space-O Technologies

      Hello Dilip,

      You need to authorize it by creating access token.

      In order to do that, create a new account on Youtube, go to settings and obtain Secret key and Authentication/access token. Once you obtain these both, put it into Config.php file.

      1. Tanvi

        Hello, I have used this code but after clicking on ‘upload button’ there is no reference to the next page means an error is coming “Object Not Found” please let me resolve this issue..

      2. Tanvi

        I have also the same problem… After getting Secret key and Authentication/access token how I need to specify both in config.php file

      3. Tanvi

        Hello, I have also the same error as @disqus_G6d4V0EeNF:disqus has but after specifying Secret key and Authentication/access token I have the same error… Please help me to resolve this error

  2. Amolika

    I tried your code and it is working fine, Thanks.
    but I am looking for some different functionality, Looking for the solution to uploaded all saved video on youtube channel automatically by running script. Can this possible.

    Please guide me

    1. Space-O Technologies

      Hi Amolika,

      Do you want to upload only existing videos from your server to Youtube channel?

      Or you want to write a script where everytime you upload a new video to your server, It should also automatically be uploaded on Youtube channel?

      1. leeker

        When a new video is upload to my server, It could also automatically be uploaded on Youtube channel, How to deal with it or How much price?

  3. Jailadin Shaik

    i have got an alert “Sorry, there was an error uploading your file.” while uploading the video plz guide me

  4. takeoff edu

    refresh tokens are not generating the access tokens automatically , i am refreshing the token manually after every onehour . please help me what should i do

  5. Tanvi

    Can you please the detailed description with the source code in my email… I have no idea to use this as I am beginner.


Leave a Reply

Your email address will not be published. Required fields are marked *