如何在我的脚本/自动加载中包含 Google App Engine for PHP?

How to include Google App Engine for PHP in my scripts / autoloading?

我在 Ubuntu 网络服务器上有一个网站(不是应用程序,也不托管在 App Engine 上),我想使用 google 云存储来存储 upload/download 大文件.我正在尝试将文件直接上传到无法正常工作的 Google Cloud Storage(可能是因为我犯了一些基本错误)。

我已经安装了Google Cloud SDK and downloaded and unzipped Google App Engine。如果我现在包含 CloudStorageTools.php 我会得到一个错误:

Class 'google\appengine\CreateUploadURLRequest' not found"

我的脚本如下所示:

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 API PHP Client allows you to connect to any Google API, including the Cloud Storage API. Here's an example, and here 是入门指南。

如果您想使用 Google App Engine (gae) 的功能,您将需要在 gae 上托管,这可能会对您的应用程序架构产生更大的影响(它使用自定义 google 编译的 php 版本具有有限的库且没有本地文件处理,因此所有这些功能都需要放入 blob 存储或 gcs - Google 云存储)。

在 ubuntu 上使用 PHP 应用程序 运行,您最好的选择是使用 google-api-php-客户端连接到存储 JSON api。 不幸的是,php 的文档不是很好。您可以查看我在 中的回答,了解如何获取/复制/删除对象。 要上传,我建议检索预签名的上传 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
});

祝你好运 - 如果你不想 google 一直使用 App Engine,那么 gcs 是一个艰难的过程!