У меня есть веб-сайт на веб-сервере Ubuntu (а не в приложении и не размещен в App Engine), и я хочу использовать облачное хранилище Google для загрузки / скачивания больших файлов. Я пытаюсь загрузить файл непосредственно в облачное хранилище Google, которое не работает (возможно, потому, что я сделал некоторые основные ошибки).
Я установил Google Cloud SDK и загрузил и распаковал Google App Engine . Если теперь включить CloudStorageTools.php
я получаю ошибку:
Класс 'google \ appengine \ CreateUploadURLRequest' не найден "
Мой скрипт выглядит так:
require_once 'google/appengine/api/cloud_storage/CloudStorageTools.php'; use google\appengine\api\cloud_storage\CloudStorageTools; $options = [ 'gs_bucket_name' => 'test' ]; $upload_url = CloudStorageTools::createUploadUrl( '/test.php' , $options );
Если вы хотите использовать функциональность Google App Engine (gae), вам нужно будет разместить на gae, что, скорее всего, будет иметь большее влияние на архитектуру вашего приложения (он использует собственную компиляцию php-версии Google с ограниченными библиотеками и отсутствие локального файла поэтому вся эта функциональность должна быть в хранилище blob или gcs – Google Cloud Storage).
С помощью приложения PHP, работающего на ubuntu, лучше всего использовать Google-api-php-клиент для подключения к хранилищу JSON api. К сожалению, документация не очень хороша для php. Вы можете проверить мой ответ в разделе Как переименовать или переместить файл в Google Cloud Storage (PHP API), чтобы узнать, как GET / COPY / DELETE объект. Для загрузки я бы предложил загрузить предварительно подписанный URL-адрес загрузки так:
//get google client and auth token for request $gc = \Google::getClient(); if($gc->isAccessTokenExpired()) $gc->getAuth()->refreshTokenWithAssertion(); $googleAccessToken = json_decode($gc->getAccessToken(), true)['access_token']; //compose url and headers for upload url request $initUploadURL = "https://www.googleapis.com/upload/storage/v1/b/" .$bucket."/o?uploadType=resumable&name=" .urlencode($file_dest); //Compose headers $initUploadHeaders = [ "Authorization" =>"Bearer ".$googleAccessToken, "X-Upload-Content-Type" => $mimetype, "X-Upload-Content-Length" => $filesize, "Content-Length" => 0, "Origin" => env('APP_ADDRESS') ]; //send request to retrieve upload url $req = $gc->getIo()->makeRequest(new \Google_Http_Request($initUploadURL, 'POST', $initUploadHeaders)); // pre signed upload url that allows client side upload $presigned_upload_URL = $req->getResponseHeader('location');
С помощью этого URL-адреса, отправленного на вашу клиентскую сторону, вы можете использовать его для PUT-файла непосредственно в своем ковше с сценарием загрузки, который генерирует соответствующий запрос PUT. Вот пример в AngularJS с ng-file-upload:
file.upload = Upload.http({ url: uploadurl.url, skipAuthorization: true, method: 'PUT', filename: file.name, headers: { "Content-Type": file.type !== '' ? file.type : 'application/octet-stream' }, data: file });
Удачи – gcs является жестким, если вы не хотите идти google полностью с движком приложения!
Клиент API API Google API позволяет вам подключаться к любому API Google, включая API облачного хранилища . Вот пример, и вот руководство по началу работы.