2013-07-25 32 views
5

Tôi đang gặp một vấn đề cố gắng để tải về một tập tin từ Google Cloud Storage sử dụng client php tìm thấy tại https://code.google.com/p/google-api-php-client/Tải file sử dụng google-api-php-client

Tôi đã chứng thực bản thân mình ok và sử dụng mã tôi sau có thể trả về một đối tượng, trong đó có các liên kết đến tập tin của tôi

$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); 

Câu trả lời là một cái gì đó giống như ...

{ 

"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.........." 
} 

Nhưng làm thế nào để tôi đi về tải f ile sử dụng ứng dụng khách PHP của Google ... Tôi không thể sử dụng file_get_contents vì nó không có kiến ​​thức về các chi tiết xác thực. Điều tốt nhất tôi đã tìm thấy là một cái gì đó mà sử dụng Google_Client nhưng câu trả lời chỉ đơn giản chứa dữ liệu meta và không có nội dung đối tượng/file

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

Trả lời

-2

để tải về tập tin, bạn cần cấp quyền truy cập READER để AllUsers (bạn có thể làm điều đó từ google web console hoặc sử dụng google php api)

+0

Không, bạn phải sử dụng các url ký, vì vậy người dùng có thời gian giới hạn truy cập đến các tệp và chỉ với url. Xem https://cloud.google.com/storage/docs/access-control#Signed-URLs – Paul

4

Câu hỏi cũ, nhưng nó giúp tôi tìm đúng hướng. selfLink là liên kết đến yêu cầu siêu dữ liệu, bạn cần mediaLink để nhận dữ liệu đối tượng thực tế và đó là getAuth thay vì getIo.

Kịch bản này sẽ đưa ra các nội dung tập tin (đưa cho bạn đã khởi tạo một đối tượng $client):

$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

Bạn là người hùng của tôi. –

0

Đây không phải là hợp lệ cho apiclient ~ 2.0, xem UPGRADING.md tập tin trong github.

đang làm việc với apiclient ~ 2.0 nên là:

$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(); 

hoặc cho phép một ứng dụng hay uống rượu hiện có:

$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(); 
Các vấn đề liên quan