2015-08-11 1 views
3

Я хочу использовать диск My Google для хранения моих файлов, которые пользователи будут загружать на моем сайте. Вот код, который я использую до сих пор.Как загрузить файлы в мой Google-привод (т. Е. Не для конечного пользователя) с помощью php

<!-- this is my index.php--> 
<?php 
ob_start(); 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 
require("functions.php"); 
session_start(); 
header('Content-Type: text/html; charset=utf-8'); 
$authUrl = getAuthorizationUrl("", ""); 
?> 
<!DOCTYPE html> 
<html lang="fi"> 
<head> 
    <title>Google Drive Login and Upload</title> 
    <meta charset="UTF-8"> 
</head> 
<body> 
<a href=<?php echo "'" . $authUrl . "'" ?>>Authorize</a> 
</body> 
</html> 


<!--This is my fileUpload.php--> 
<?php 
ob_start(); 
require_once("functions.php"); 
session_start(); 

header('Content-Type: text/html; charset=utf-8'); 

global $CLIENT_ID, $CLIENT_SECRET, $REDIRECT_URI; 
$client = new Google_Client(); 
$client->setClientId($CLIENT_ID); 
$client->setClientSecret($CLIENT_SECRET); 
$client->setRedirectUri($REDIRECT_URI); 
$client->setScopes('email'); 

$authUrl = $client->createAuthUrl();  
getCredentials($_GET['code'], $authUrl); 

$userName = $_SESSION["userInfo"]["name"]; 
$userEmail = $_SESSION["userInfo"]["email"]; 

?> 
<!DOCTYPE html> 
<html lang="fi"> 
<head> 
    <title>Logged in</title> 
    <meta charset="UTF-8"> 
</head> 
<body> 

    Hello <?php echo $userName; ?>! 
    <br> 
    <?php echo $userEmail; ?> 

    <br><br><br> 

    <form enctype="multipart/form-data" action="formAction.php" method="POST"> 
     <input type="file" name="file" required> 
     <br><br> 
     <label for="folderName">Folder name, this either uploads file to an existing folder or creates a new one based on the name</label> 
     <br> 
     <input type="text" name="folderName" placeholder="My cat Whiskers"> 

     <br><br> 
     <input type="submit" name="submit" value="Upload to Drive"> 
    </form> 

</body> 
</html> 

<!-- this is my formaction.php where the action goes after submitting the file upload form--> 
<?php 
require_once 'google-api-php-client/src/Google/Client.php'; 
require_once 'google-api-php-client/src/Google/Service/Oauth2.php'; 
require_once 'google-api-php-client/src/Google/Service/Drive.php'; 
session_start(); 

header('Content-Type: text/html; charset=utf-8'); 

// Init the variables 
$driveInfo = ""; 
$folderName = ""; 
$folderDesc = ""; 

// Get the file path from the variable 
$file_tmp_name = $_FILES["file"]["tmp_name"]; 

// Get the client Google credentials 
$credentials = $_COOKIE["credentials"]; 

// Get your app info from JSON downloaded from google dev console 
$json = json_decode(file_get_contents("composer.json"), true); 
$CLIENT_ID = $json['web']['client_id']; 
$CLIENT_SECRET = $json['web']['client_secret']; 
$REDIRECT_URI = $json['web']['redirect_uris'][0]; 

// Create a new Client 
$client = new Google_Client(); 
$client->setClientId($CLIENT_ID); 
$client->setClientSecret($CLIENT_SECRET); 
$client->setRedirectUri($REDIRECT_URI); 
$client->addScope(
    "https://www.googleapis.com/auth/drive", 
    "https://www.googleapis.com/auth/drive.appfolder"); 

// Refresh the user token and grand the privileges 
$client->setAccessToken($credentials); 
$service = new Google_Service_Drive($client); 

// Set the file metadata for drive 
$mimeType = $_FILES["file"]["type"]; 
$title = $_FILES["file"]["name"]; 
$description = "Uploaded from your very first google drive application!"; 

// Get the folder metadata 
if (!empty($_POST["folderName"])) 
    $folderName = $_POST["folderName"]; 
if (!empty($_POST["folderDesc"])) 
    $folderDesc = $_POST["folderDesc"]; 

// Call the insert function with parameters listed below 
$driveInfo = insertFile($service, $title, $description, $mimeType, $file_tmp_name, $folderName, $folderDesc); 

/** 
* Get the folder ID if it exists, if it doesnt exist, create it and return the ID 
* 
* @param Google_DriveService $service Drive API service instance. 
* @param String $folderName Name of the folder you want to search or create 
* @param String $folderDesc Description metadata for Drive about the folder (optional) 
* @return Google_Drivefile that was created or got. Returns NULL if an API error occured 
*/ 
function getFolderExistsCreate($service, $folderName, $folderDesc) { 
    // List all user files (and folders) at Drive root 
    $files = $service->files->listFiles(); 
    $found = false; 

    // Go through each one to see if there is already a folder with the specified name 
    foreach ($files['items'] as $item) { 
     if ($item['title'] == $folderName) { 
      $found = true; 
      return $item['id']; 
      break; 
     } 
    } 

    // If not, create one 
    if ($found == false) { 
     $folder = new Google_Service_Drive_DriveFile(); 

     //Setup the folder to create 
     $folder->setTitle($folderName); 

     if(!empty($folderDesc)) 
      $folder->setDescription($folderDesc); 

     $folder->setMimeType('application/vnd.google-apps.folder'); 

     //Create the Folder 
     try { 
      $createdFile = $service->files->insert($folder, array(
       'mimeType' => 'application/vnd.google-apps.folder', 
       )); 

      // Return the created folder's id 
      return $createdFile->id; 
     } catch (Exception $e) { 
      print "An error occurred: " . $e->getMessage(); 
     } 
    } 
} 

/** 
* Insert new file in the Application Data folder. 
* 
* @param Google_DriveService $service Drive API service instance. 
* @param string $title Title of the file to insert, including the extension. 
* @param string $description Description of the file to insert. 
* @param string $mimeType MIME type of the file to insert. 
* @param string $filename Filename of the file to insert. 
* @return Google_DriveFile The file that was inserted. NULL is returned if an API error occurred. 
*/ 
function insertFile($service, $title, $description, $mimeType, $filename, $folderName, $folderDesc) { 
    $file = new Google_Service_Drive_DriveFile(); 

    // Set the metadata 
    $file->setTitle($title); 
    $file->setDescription($description); 
    $file->setMimeType($mimeType); 

    // Setup the folder you want the file in, if it is wanted in a folder 
    if(isset($folderName)) { 
     if(!empty($folderName)) { 
      $parent = new Google_Service_Drive_ParentReference(); 
      $parent->setId(getFolderExistsCreate($service, $folderName, $folderDesc)); 
      $file->setParents(array($parent)); 
     } 
    } 
    try { 
     // Get the contents of the file uploaded 
     $data = file_get_contents($filename); 

     // Try to upload the file, you can add the parameters e.g. if you want to convert a .doc to editable google format, add 'convert' = 'true' 
     $createdFile = $service->files->insert($file, array(
      'data' => $data, 
      'mimeType' => $mimeType, 
      'uploadType'=> 'multipart' 
      )); 

     // Return a bunch of data including the link to the file we just uploaded 
     return $createdFile; 
    } catch (Exception $e) { 
     print "An error occurred: " . $e->getMessage(); 
    } 
} 

echo "<br>Link to file: " . $driveInfo["alternateLink"]; 

?> 

Проблема я получаю, когда пользователь загрузить файл, он не приходит в мой Google диск, но он идет на Диске этого пользователя. :( То, что я не хочу. Я хочу сохранить этот файл в мой диск Google.

Пожалуйста, помогите !! Спасибо.

+0

Посмотрите на быстрый старт, его прямой вперед, если настройки правильные. Быстрый запуск - это [здесь] (https://developers.google.com/drive/web/quickstart/php) –

+0

Быстрый старт - это то, что он уже использует – pinoyyid

ответ

-3

Проверить это

require_once 'Google/Client.php'; 
require_once 'Google/Service/Drive.php'; 

$client = new Google_Client(); 
// create an app in google and use credential form that app 
$client->setClientId('<HERE_YOUR_CLIENT_ID>'); 
$client->setClientSecret('<HERE_YOUR_CLIENT_SECRET>'); 
$client->setRedirectUri('<HERE_YOUR_REGISTERED_REDIRECT_URI>'); 
$client->setScopes(array('https://www.googleapis.com/auth/drive.file')); 

session_start(); 

if (isset($_GET['code']) || (isset($_SESSION['access_token']) && $_SESSION['access_token'])) { 
    if (isset($_GET['code'])) { 
     $client->authenticate($_GET['code']); 
     $_SESSION['access_token'] = $client->getAccessToken(); 
    } else 
     $client->setAccessToken($_SESSION['access_token']); 

    $service = new Google_Service_Drive($client); 

    //Insert a file 
    $file = new Google_Service_Drive_DriveFile(); 
    $file->setTitle(uniqid().'.jpg'); 
    $file->setDescription('A test document'); 
    $file->setMimeType('image/jpeg'); 

    $data = file_get_contents('a.jpg'); 

    $createdFile = $service->files->insert($file, array(
      'data' => $data, 
      'mimeType' => 'image/jpeg', 
      'uploadType' => 'multipart' 
    )); 

    print_r($createdFile); 

} else { 
    $authUrl = $client->createAuthUrl(); 
    header('Location: ' . $authUrl); 
    die(); 
} 

Перед использованием у вас должно быть приложение Google, а sdk.

Thanks

+0

Не отвечает на вопрос – pinoyyid

0

Если вы успешно загружаете файлы на Google Диск, то поздравления. Ты почти там. Единственное, что вам нужно изменить, это то, как вы получаете токен доступа. См. How do I authorise an app (web or installed) without user intervention? (canonical ?)

+0

, что связанный ответ в порядке, но я добавил комментарий там. не выбрасывайте свой текущий поток. вместо использования игровой площадки (как предлагается в этой ссылке) превратите свой текущий поток в страницу только для администратора, которая сохраняет токен обновления обновления. то все пользователи используют этот токен. остерегайтесь квот предельных ставок и хорошо их обрабатывайте (экспоненциальная отсрочка) –

+0

НЕ используйте экспоненциальную отсрочку для проблем с ограничением скорости. Он убьет вас – pinoyyid

+0

тривиальный exp. отсрочка будет незначительной, но не та, которая адаптирует и сохраняет оптимальную задержку и не возвращается к нулю при успешном завершении. я сделал это. –