谷歌云存储 - 上传大文件 (4GB)

Posted

技术标签:

【中文标题】谷歌云存储 - 上传大文件 (4GB)【英文标题】:Google Cloud Storage - Upload Large File (4GB) 【发布时间】:2018-10-10 07:36:42 【问题描述】:

我有以下脚本可以处理小文件,但是当我尝试大文件 (4GB) 时失败:

<?php

  require 'vendor/autoload.php';

  use Google\Cloud\Storage\StorageClient;

  $storage = new StorageClient([
      'keyFilePath' => 'keyfile.json',
      'projectId' => 'storage-123456'
  ]);

  $bucket = $storage->bucket('my-bucket');

  $options = [
      'resumable' => true,
        'chunkSize' => 200000,
        'predefinedAcl' => 'publicRead'
  ];

  // Upload a file to the bucket.
  $bucket->upload(
      fopen('data/file.imgc', 'r'),
      $options
  );

?>

我收到的错误是:

Fatal error: Uncaught exception 'Google\Cloud\Core\Exception\GoogleException' with message 'Upload failed. Please use this URI to resume your upload:

知道如何上传大文件吗?

http://googlecloudplatform.github.io/google-cloud-php/#/docs/google-cloud/v0.61.0/storage/bucket?method=upload

我也试过 getResumableUploader():

$uploader = $bucket->getResumableUploader(fopen('data/file.imgc', 'r'), [
  'name' => 'file.imgc'
]);

try 
  $object = $uploader->upload();
 catch (GoogleException $ex) 
  $resumeUri = $uploader->getResumeUri();
  $object = $uploader->resume($resumeUri);

当导航到恢复 URI 时,它会返回“不允许的方法”

【问题讨论】:

这可以通过this package分块上传文件来完成。示例项目 - github.com/pionl/laravel-chunk-upload-example 【参考方案1】:

我没有使用过这个 API,但我认为你不应该只是将一个大文件打开到内存中,然后将它塞进这个单一的请求中。你正在请求一个可恢复的操作,所以读取文件的一小部分,比如一次几 MB,然后循环遍历它,直到你上传了它的所有部分。

【讨论】:

【参考方案2】:

一个突出的问题可能是选择的 chunkSize 为 200000。根据文档,chunkSize 必须提供为 262144 的倍数。

另外,在处理大文件时,我强烈建议使用Bucket::getResumableUploader()。它将帮助您更好地控制上传过程,您应该会发现它会更可靠:)。我分享的链接中有一个代码 sn-p 应该可以帮助您入门。

【讨论】:

嗨大卫,我试过 getResumableUploader() 并得到以下响应:Fatal error: Uncaught exception 'Google\Cloud\Core\Exception\GoogleException' with message 'Upload failed. Please use this URI to resume your upload: https://www.googleapis.com/upload/storage/v1/b/jobsystem/o?uploadType=resumable&amp;upload_id=AEnB2UpSE4ZNrO3qk06BgmFVOUUXlbEPgTxO84DCGOlTspm4Mg-465htc5aPbHtYK89Qbavkgz_6Nhfe1-_AG2iDQhRobklG0Q' in C:\wamp64\www\google-cloud-php\Storage\vendor\google\cloud-core\src\Upload\ResumableUploader.php on line 170 链接返回 Method Not Allowed,有什么想法吗?谢谢 在将 chunkSize 设置为 262144 时仍然遇到问题吗? 文档在哪里说它必须是 262144 @davids 的倍数?我找不到它。我使用了很多不同的块大小,它们不是倍数,也没有发现任何问题。

以上是关于谷歌云存储 - 上传大文件 (4GB)的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSIS 将本地文件上传到谷歌云存储桶

可恢复上传的“临时文件”是不是计入每月存储费? (谷歌云存储)

谷歌云存储 - 从网络下载文件

如何使用签名的 URL 将文件上传到谷歌云存储桶

将缓冲区上传到谷歌云存储

使用 ajax 通过签名的 url 将文件上传到谷歌云存储