2016-10-13 15 views
5

PHPを使用してGoogleドライブAPI v3のダウンロードフローを理解しようとしています。私は、ファイルをダウンロードするにはAPI V2を使用:GoogleドライブAPI v3 - PHPでファイルをダウンロード

  • ファイルのメタデータ
  • を手に入れたファイルへの直接のリンクを取得するにはdownloadUrlパラメータを使用しますが、それにはOAuthトークンを添付し、それにGET要求を行いました。

これは廃止されているように見えるAPI V3を使用して、あなたはファイルそのものではなく、メタデータを取得する"alt" => "media"の配列パラメータでドライブサービスfiles->get()を呼び出すdocsによります。

そして、彼らの例た:

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

私もこれがどのように機能するかを理解する問題が発生したことだし、コードをトロールしているが、それは多くのより多くの情報を与えていません。

get()に電話すると、実際には$contentに入りますか?それはファイルの内容ですか(この場合、大容量のファイルを扱うときには面倒なようです - 確かにメモリが足りなくなりますか?)、またはfopenと呼ぶことができる何らかのタイプのストリーム参照ですか?このファイルをディスクに保存するにはどうすればよいですか?

このAPI呼び出しを行ったときに何が起こったのかについての詳細は実際には書かれていません。

答えて

11

私はそれを少し試してみました。あなたはGuzzle response object(明らかにクライアントライブラリは、それが輸送の基礎となるだためがつがつ食う使用される)である基本的なHTTPレスポンスを取得するドキュメントに指定されているあなたはalt=>mediaパラメータでget()メソッドを呼び出す

そこから、$response->getStatusCode()などのGuzzレスポンスメソッドを呼び出すことができます。実際のファイルコンテンツのストリームを取得することもできます。

これがどこかで文書化されていれば役に立ちましたでしょうか。

EDIT:他の誰かがファイルの保存方法に慣れていない場合の大まかな例です。

<?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

ありがとうございました。追加情報が必要でしたが、何らかの理由で1024ブロックの読み込みがうまくいきませんでした。私はコードをfwrite($ outHandle、$ content-> getBody())に変更していましたが、それはうまくいきました。 –

+1

ありがとう!!非常に役立ちます。 –

関連する問題