首页 > 解决方案 > 在 appengine 上使用 php 将大文件下载到云存储

问题描述

我的 appengine 项目(在 App Engine 标准环境上运行)使用 appengine 之外的媒体转换器服务。我可以轻松地开始新的转换工作,并在工作完成时收到通知。媒体转换器提供一个临时 url 来检索转换结果(mp4 文件)。

现在我想开始一个后台作业,将这个转换后的文件从媒体转换器下载到我的谷歌云存储中。

到目前为止,无论我尝试了什么,我都无法下载 32 mb 的更大文件。

到目前为止,这些是我的方法:

第一个只需按照https://cloud.google.com/appengine/docs/standard/php/googlestorage/上的建议复制 file_put_contents / file_get_contents

$options = [
                'Content-Type' => 'video/mp4',
                'Content-Disposition' => 'inline',
];
$context = stream_context_create(['gs' => $options]);
file_put_contents($targetPath, file_get_contents($url), 0, $context);

然后我尝试直接使用流:

$CHUNK_SIZE =  1024*1024;
$targetStream = fopen($targetPath, 'w');
$sourceStream = fopen($url, 'rb');
if ($sourceStream === false) {
  return false;
}
while (!feof($sourceStream)) {
  $buffer = fread($sourceStream, $CHUNK_SIZE);
  Logger::log("Chuck");
  fwrite($targetStream, $buffer);
}
fclose($sourceStream);
fclose($targetStream);

然后我很惊讶这实际上有效(高达 32 mb)

  copy($url, $targetPath);

我现在没有想法了。有什么建议么?我有点需要php中gutil的cp函数。 https://cloud.google.com/storage/docs/quickstart-gsutil

我认为这个stackoverflow问题有一个类似的问题: Large file upload to google cloud storage using PHP

标签: phpgoogle-app-enginegoogle-cloud-storagegoogle-api-php-client

解决方案


传入请求的数据严格限制为 32MB。

有关更多详细信息,请参阅传入带宽- https://cloud.google.com/appengine/quotas。这一定是您无法超过 32MB 限制的原因。

可能的解决方案 -

您可以修改媒体转换器服务吗?

如果是 - 在媒体转换器服务中创建一个 API,并通过从 AppEngine 应用程序调用端点在媒体转换器服务本身进行云存储上传。使用服务帐户进行云存储身份验证 ( https://cloud.google.com/storage/docs/authentication#storage-authentication-php )。

如果否 - 您可以使用 Compute Engine 执行相同的操作。在 Compute Engine 中创建一个 API,您将在其中传递文件的 URL 以响应 AppEngine 中的后台作业。使用服务帐户身份验证上传到云存储。


推荐阅读