使用Appengine上的php将大文件下载到云存储中

时间:2018-08-14 15:31:03

标签: php google-app-engine google-cloud-storage google-api-php-client

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

现在我要开始后台工作,以将转换后的文件从媒体转换器下载到我的Google云存储中。

到目前为止,无论我尝试什么,我都无法下载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

1 个答案:

答案 0 :(得分:1)

传入请求的数据严格限制为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中的后台作业。使用服务帐户身份验证上传到云存储。