У меня возникла проблема с загрузкой файла из Google Cloud Storage с помощью php-клиента, найденного по адресу https://code.google.com/p/google-api-php-client/
Я аутентифицировал себя нормально и используя следующий код, я могу вернуть объект, содержащий ссылку на мой файл
$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);
Ответ – это что-то вроде …
{ "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.........." }
Но как мне начать загрузку файла с помощью Google PHP-клиента … Я не могу использовать файл_get_contents, так как он не знает сведений об аутентификации. Лучшая вещь, которую я нашел, – это то, что использует Google_Client, но ответ просто содержит метаданные и содержимое объекта / файла
$request = new Google_HttpRequest($object['selfLink']); $response = $this->client->getIo()->authenticatedRequest($request);
Старый вопрос, но он заставил меня смотреть в правильном направлении. selfLink
– это ссылка на запрос метаданных, вам нужна mediaLink
чтобы получить фактические данные объекта, и это getAuth
а не getIo
.
Этот скрипт выведет содержимое файла (если вы уже инициализировали объект $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();
Это неверно для apiclient ~ 2.0, см. Файл UPGRADING.md в github.
Рабочий код с apiclient ~ 2.0 должен быть:
$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();
или авторизацию существующего клиента Guzzle:
$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();
для загрузки файла вам необходимо предоставить доступ READER к allUsers (вы можете сделать это с веб-консоли Google или использовать google php api)