2012-11-16 6 views
6

J'ai de sérieux problèmes avec la documentation de la nouvelle bibliothèque cliente de l'API google drive. Il semble que cela devrait être facile de répondre sans avoir à le mettre sur stackoverflow. Je considère sérieusement rouler le mien sur celui-ci, une bibliothèque de 64 pages qui "fonctionne juste" est jusqu'à présent un "mal de tête total"API Google Drive - Bibliothèque cliente PHP - définition de uploadType pour la reprise de téléchargement

Comment diable définissez-vous le uploadType à "resumable" au lieu du "par défaut" simple ". J'ai cherché dans la bibliothèque un moyen de le faire, mais il semble inexistant. Leur seul indice est le code sur leur échantillon Uploader Page https://developers.google.com/drive/quickstart-php

//Insert a file 
$file = new Google_DriveFile(); 
$file->setTitle('My document'); 
$file->setDescription('A test document'); 
$file->setMimeType('text/plain'); 

$data = file_get_contents('document.txt'); 

$createdFile = $service->files->insert($file, array(
     'data' => $data, 
     'mimeType' => 'text/plain', 
    )); 

Rien ne définit ici le uploadType ... ???

Leur docs sur une autre page, montrent uploadType comme une partie de l'adresse comme GET: https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable mais lorsque vous utilisez $service->files->insert, la bibliothèque définit l'adresse.

+2

tous ces types de questions pourraient être évités si Google avait juste un ensemble de documents similaires à la façon dont leur bibliothèque jQuery documents. Ce serait génial s'ils avaient au moins une liste de toutes les méthodes disponibles dans la bibliothèque client php triées par classe quelque part en ligne. Est-ce que quelque chose comme ça existe? – pathfinder

Répondre

5

L'exemple suivant travaillera avec la dernière version du client API Google PHP (https://code.google.com/p/google-api-php-client/source/checkout)

if ($client->getAccessToken()) { 
    $filePath = "path/to/foo.txt"; 
    $chunkSizeBytes = 1 * 1024 * 1024; 

    $file = new Google_DriveFile(); 
    $file->setTitle('My document'); 
    $file->setDescription('A test document'); 
    $file->setMimeType('text/plain'); 

    $media = new Google_MediaFileUpload('text/plain', null, true, $chunkSizeBytes); 
    $media->setFileSize(filesize($filePath)); 

    $result = $service->files->insert($file, array('mediaUpload' => $media)); 

    $status = false; 
    $handle = fopen($filePath, "rb"); 
    while (!$status && !feof($handle)) { 
    $chunk = fread($handle, $chunkSizeBytes); 
    $uploadStatus = $media->nextChunk($result, $chunk); 
    } 

    fclose($handle); 
} 
+0

Cela fonctionne parfaitement et a été très utile lorsqu'un autre développeur implémenté avec un téléchargeur de fichier simple qui causait des problèmes de mémoire. Cette implémentation nous permet de ne jamais dépasser 700 Mo de mémoire utilisée, même avec 10 téléchargements simultanés de 2 à 5 Go. Excellent! – Stephan

5

Cela peut être une référence plus récente, mais ici est de prendre officielle de Google sur cette question: https://developers.google.com/api-client-library/php/guide/media_upload

de l'article:

fichier Télécharger

Reprise possible

Il est également possible de diviser le téléchargement entre plusieurs demandes. Cette est pratique pour les fichiers volumineux, et permet la reprise du téléchargement si il y a un problème. Les mises en ligne résumables peuvent être envoyées avec des métadonnées séparées .

$file = new Google_Service_Drive_DriveFile(); 
$file->title = "Big File"; 
$chunkSizeBytes = 1 * 1024 * 1024; 

// Call the API with the media upload, defer so it doesn't immediately return. 
$client->setDefer(true); 
$request = $service->files->insert($file); 

// Create a media file upload to represent our upload process. 
$media = new Google_Http_MediaFileUpload(
    $client, 
    $request, 
    'text/plain', 
    null, 
    true, 
    $chunkSizeBytes 
); 
$media->setFileSize(filesize("path/to/file")); 

// Upload the various chunks. $status will be false until the process is 
// complete. 
$status = false; 
$handle = fopen("path/to/file", "rb"); 
while (!$status && !feof($handle)) { 
    $chunk = fread($handle, $chunkSizeBytes); 
    $status = $media->nextChunk($chunk); 
} 

// The final value of $status will be the data from the API for the object 
// that has been uploaded. 
$result = false; 
if($status != false) { 
    $result = $status; 
} 

fclose($handle); 
// Reset to the client to execute requests immediately in the future. 
$client->setDefer(false); 
+0

Salut Andrew, j'utilise ce code mais je n'ai aucune idée de comment je devrais faire des requêtes pour obtenir le statut de bloc pour gérer la reprise d'un téléchargement interrompu et montrer la progression, ce code ne retourne $ status que lorsque le fichier entier est téléchargé. –

+0

Hey @RamtinGh; D'après ce que je peux dire, la classe 'Google_Http_MediaFileUpload' gère tout cela pour vous; la source de la fonction 'nextChunk()' apparaît pour voir si des morceaux complets ont déjà été téléchargés sur la base de la réponse HTTP du serveur, et si c'est le cas, elle passe au segment suivant jusqu'à ce qu'il en ait un à télécharger: https://github.com/google/google-api-php-client/blob/master/src/Google/Http/MediaFileUpload.php#L128 –

+0

Merci @Andrew, je suis conscient que la bibliothèque client gère cela, mais en utilisant ce code, il n'y a aucun moyen d'obtenir le statut de bloc à moins que le fichier entier soit téléchargé, la classe l'utilise pour voir si le téléchargement est terminé. pour reprendre le téléchargement interrompu, j'ai besoin de faire une requête pour voir combien d'octets sont envoyés, la bibliothèque ne le fait pas elle-même, si la connexion est interrompue, le script arrêtera de s'exécuter et je ne sais pas comment resoudre. –

Questions connexes