2013-07-25 30 views
5

Mam problem próbuje pobrać plik z Google Cloud Storage użyciu klienta php znaleźć na https://code.google.com/p/google-api-php-client/Pobieranie plików za pomocą Google-api-php-client

Mam uwierzytelnioną się ok, a za pomocą kodu następującą I może zwrócić przedmiot, który zawiera link do mojego pliku

$this->storageService = new Google_StorageService($this->client); 
$this->objects = $this->storageService->objects; 

$options = array(
    'prefix' => 'REPORT_NAME_2013-07-01' 
); 
$bucket_contents = $this->objects->listObjects($bucket, $options); 

odpowiedź jest coś takiego jak ...

{ 

"kind": "storage#object", 
"id": "<bucket>/<report>.csv/1001", 
"selfLink": "https://www.googleapis.com/storage/v1beta2/b/<bucket>/o/<report>.csv", 
"name": "<report>.csv", 
"bucket": "<bucket>", 
"generation": "1001", 
"metageneration": "1", 
"contentType": "application/csv", 
"updated": "2013-07-22T10:21:08.811Z", 
"size": "806", 
"md5Hash": "wT01i....", 
"mediaLink": "https://www.googleapis.com/storage/v1beta2/b/<bucket>/o/<report>.csv?generation=1001&alt=media", 
"owner": { 
    "entity": "user-00b........", 
    "entityId": "00b490......." 
}, 
"crc32c": "8y........", 
"etag": "CPjZ.........." 
} 

Ale jak mogę iść o pobraniu f ile za pomocą klienta PHP Google ... Nie mogę użyć pliku file_get_contents, ponieważ nie ma on wiedzy o szczegółach uwierzytelniania. Najlepszą rzeczą znalazłem coś, co wykorzystuje Google_Client ale odpowiedź po prostu zawiera dane meta i żadnej zawartości obiektu/pliku

$request = new Google_HttpRequest($object['selfLink']); 
$response = $this->client->getIo()->authenticatedRequest($request); 

Odpowiedz

-2

do pobierania pliku, trzeba przyznać READER dostęp do ALLUSERS (można to zrobić z google web console lub użyj google php api)

+0

Nie, trzeba użyć podpisane adresy URL, więc użytkownicy mają ograniczony czas dostępu do pliki i tylko z adresem URL. Zobacz https://cloud.google.com/storage/docs/access-control#Signed-URLs – Paul

4

Stare pytanie, ale sprawiło, że patrzyłem we właściwym kierunku. selfLink jest linkiem do żądania metadanych, aby uzyskać rzeczywiste dane obiektu, potrzebny jest mediaLink, a jest to getAuth zamiast getIo.

Ten skrypt wyświetli zawartość pliku (podane zostały już zainicjowane się $client Object):

$service = new Google_Service_Storage($client); 
$object = $service->objects->get('bucketname', 'objectname'); 
$request = new Google_Http_Request($object->getMediaLink()); 
$response = $client->getAuth()->authenticatedRequest($request); 
echo $response->getResponseBody(); 
+0

Jesteś moim bohaterem. –

0

To nie jest ważny dla apiclient ~ 2.0, patrz UPGRADING.md plik w github.

kod Praca z apiclient ~ 2.0 powinno być:

$service = new Google_Service_Storage($client); 
$object = $service->objects->get('bucketname', 'objectname'); 

// create an authorized HTTP client 
$httpClient = $client->authorize(); 

$response = $httpClient->request('GET', $object->getMediaLink()); 

echo $response->getBody(); 

lub upoważnienia istniejącego klienta chlać:

$service = new Google_Service_Storage($client); 
$object = $service->objects->get('bucketname', 'objectname'); 

// add authorization to an existing client 
$httpClient = new GuzzleHttp\Client(); 
$httpClient = $client->authorize($httpClient); 

$response = $httpClient->request('GET', $object->getMediaLink()); 

echo $response->getBody(); 
Powiązane problemy