PHP 中的 Google Cloud 可恢复上传 - 它在编程上与常规上传有何不同?

问题描述

我有一个 Google Cloud 上传功能,可以很好地处理我上传的相对较小的文件(请参阅下面的代码)。但是我很快就需要上传最大 500Meg 的文件,我正在研究“可恢复”上传选项。在 Google 文档中,基本上说超过 5Meg 的文件和 Google 只是将上传转换为可恢复的上传类型。但是,这是什么意思?这是否意味着我不必进行任何编码更改?这是否意味着如果我的页面超时并且我重新调用页面并再次开始下载,那么 Google Api自动检测到之前的上传失败,并且只会简单地从停止的地方继续上传,然后只返回一个有效的上传完成后(非空)storageObject 给我?

这是我当前的“不可恢复”代码

function uploadFile($bucketName,&$fileContent,$cloudpath) {
    $privateKeyFileContent = $GLOBALS['privateKeyFileContent'];
    // connect to Google Cloud Storage using private key as authentication
    try {
        $storage = new StorageClient([
            'keyFile' => json_decode($privateKeyFileContent,true)
        ]);
    } catch (Exception $e) {
        // maybe invalid private key ?
        print $e;
        return false;
    }

    // set which bucket to work in
    $bucket = $storage->bucket($bucketName);

    $sfilehash = base64_encode(md5($fileContent,true)); 

    $storageObject = $bucket->upload(
            $fileContent,[
            'name' => $cloudpath,'Metadata' => ['md5Hash' => $sfilehash]
            ]
    );

    return $storageObject; // will be null on failure
}

解决方法

upload()getResumableUploader() 之间的差异中,我们可以看到非常奇怪的文档。根据 Cloud client Library 上的文档,上传功能指出:

以简单的方式上传您的数据。上传将默认为 如果文件大小大于 5mb,则可恢复。

正如 Cloud Storage 文档所述:

可恢复的上传会自动为您管理,但也可以 使用可恢复选项直接控制。

这意味着使用您当前的代码,您可以通过添加 upload() 在代码中启用 'resumable' => true 的可恢复选项。虽然我不太确定,但可能有一些幕后的东西没有看到,文档也没有解释清楚。这个例子看起来像:

$storageObject = $bucket->upload(
        $fileContent,[
        'name' => $cloudPath,'metadata' => ['md5Hash' => $sFileHash],'resumable' => true
        ]
);

我在 github 上查看了这两种方法的 source code,它们几乎具有相同的配置选项,但 getresumableUpload() 包含 getResumeUri(),这是 resume() 所必需的,虽然我不排除它,但我似乎无法找到正常 upload() 的兼容性。

$uploader = $bucket->getResumableUploader(
    fopen($fileContent,'r'),[
      'name' => $cloudPath,'metadata' => ['md5Hash' => $sFileHash]
      ]
);

try {
    $object = $uploader->upload();
} catch (GoogleException $ex) {
    //if there is an error it can automatically restart
    //$uploader contains 'resumeUri' which is what is used to resume the upload
    $resumeUri = $uploader->getResumeUri();
    $object = $uploader->resume($resumeUri);
}

resume() 处理为您继续上传而发送的所有必要标头和字节。

您所描述的案例应该是可恢复的。

以下所有 HTTP 状态响应都被视为可重试:

  • 408 请求超时
  • 500 内部服务器错误
  • 502 错误网关
  • 503 服务不可用
  • 504 网关超时

以下 HTTP 状态响应不可重试:

  • 404 未找到
  • 410 不见了

有关 HTTP 状态的更多信息 here