php - 在 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
解决方案
传入请求的数据严格限制为 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 中的后台作业。使用服务帐户身份验证上传到云存储。
推荐阅读
- android - Google Play 上的内部测试应用只提供卸载选项,无法打开
- typescript - React Native TypeScript 错误:“ScrollView”类型上不存在属性“calcYOffset”
- c++ - 读取位图文件
- mysql - 提取分隔符之间的字符串并填充到列中
- r - 将 SliderTextInput 从单个值转换为多个
- java - 工具栏菜单导致我的应用程序在打开时崩溃
- java - 使 JDK 版本保持最新的策略
- javascript - 如何限制命令的使用次数(Discord.js)
- python - 使用 Trace 时出现浮动错误
- visual-studio - 在包管理器控制台中运行命令时无法识别 Nuget CLI 命令并且出现错误