2016-10-13 1 views
5

PHP를 사용하여 Google 드라이브 API v3의 다운로드 과정을 이해하려고합니다. 은 API V2를 사용하여 파일을 I 다운로드 : 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

나는 약간의 실험을 끝낸 후에 그것을 알아 냈다.

워드 프로세서에 지정된대로 alt=>media 매개 변수와 함께 get() 메서드를 호출 할 때 당신은 (클라이언트 라이브러리가 수송을 기본 것에 대한 목구멍 사용 분명히 같은) Guzzle response object입니다 기본 HTTP 응답을 얻을.

거기에서 $response->getStatusCode()과 같은 Guzzle 응답 방법을 호출하거나 실제 파일 내용의 스트림을 얻을 수 있습니다.

어딘가에 문서화했다면 도움이 되었겠습니까?

편집 : 다른 사람이 파일을 저장하는 방법을 고수하면 거친 예가 있습니다.

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

감사합니다 !! 매우 도움이됩니다. –