2016-10-13 3 views
5

Ich versuche den Download-Flow für die Google Drive API v3 mit PHP zu verstehen. Mit Hilfe der API v2 einer Datei, die ich zum Download:Google Drive API v3 - Herunterladen von Dateien in PHP

  • Haben Sie die Datei-Metadaten
  • den downloadURL Parameter verwendet, um einen direkten Link auf die Datei zu erhalten, die an sie ein OAuth-Token und machte eine GET-Anfrage an, dass.

Mit API v3 dies scheint veraltet sind, und nach dem docs Sie files->get() auf dem Drive Service mit einem Array-Parameter von "alt" => "media" rufen Sie die Datei selbst, anstatt die Metadaten zu erhalten.

Und ihr Beispiel war:

$fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M'; 
$content = $driveService->files->get($fileId, array(
'alt' => 'media')); 

Ich habe Probleme zu verstehen, wie dies durch den Code aber und haben funktioniert surften aber es hat nicht viel mehr Informationen geben.

Wenn Sie get() anrufen, was geht eigentlich in $content10 in dem Beispiel? Ist es der Inhalt der Datei (in diesem Fall scheint dies lästig im Umgang mit großen Dateien - sicherlich werden Sie nicht mehr genügend Arbeitsspeicher ?!) oder ist es eine Art von Stream-Referenz, die ich anrufen kann? Wie würde ich diese Datei auf der Festplatte speichern?

Die Dokumentation geht nicht wirklich ins Detail darüber, was passiert, wenn Sie diesen API-Aufruf machen, es sagt nur, es führt einen Dateidownload durch?

Antwort

11

Ich habe es nach ein bisschen Experimentieren herausgefunden.

Wenn Sie die get() Methode mit dem alt=>media Parameter aufrufen, wie in der Dokumentation angegeben Sie die zugrunde liegende HTTP-Antwort erhalten, die eine Guzzle response object (wie anscheinend die Client-Bibliothek verwendet Guzzle dafür Transport zugrunde liegenden).

Von dort können Sie rufen Sie jede Guzzle-Antwort-Methode wie $response->getStatusCode() oder Sie können einen Strom der tatsächlichen Datei Inhalt erhalten.

Wäre hilfreich gewesen, wenn sie das irgendwo dokumentiert hätten!

BEARBEITEN: Hier ist ein grobes Beispiel, wenn jemand anderes, wie man eine Datei speichert, stecken bleibt.

<?php 

date_default_timezone_set("Europe/London"); 
require_once 'vendor/autoload.php'; 

// I'm using a service account, use whatever Google auth flow for your type of account. 

putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/service/account/key.json'); 
$client = new Google_Client(); 
$client->addScope(Google_Service_Drive::DRIVE); 
$client->useApplicationDefaultCredentials(); 

$service = new Google_Service_Drive($client); 

$fileId = "0Bxxxxxxxxxxxxxxxxxxxx"; // Google File ID 
$content = $service->files->get($fileId, array("alt" => "media")); 

// Open file handle for output. 

$outHandle = fopen("/path/to/destination", "w+"); 

// Until we have reached the EOF, read 1024 bytes at a time and write to the output file handle. 

while (!$content->getBody()->eof()) { 
     fwrite($outHandle, $content->getBody()->read(1024)); 
} 

// Close output file handle. 

fclose($outHandle); 
echo "Done.\n" 

?> 
+1

Danke, ich brauchte diese zusätzlichen Informationen, aber aus irgendeinem Grund funktionierte das Lesen von 1024 Blöcken nicht für mich. Ich änderte den Code in fwrite ($ outHandle, $ content-> getBody()) ohne die while und es funktionierte. –

+1

Danke !! Sehr hilfreich. –

Verwandte Themen