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

时间:2018-04-30 08:22:18

标签: php google-cloud-platform google-cloud-storage

我有以下脚本可以处理小文件,但是当我尝试一个巨大的文件(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时,它返回“Method Not Allowed”

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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