将大文件上传到 blob 时出现 403 错误

Getting 403 error when uploading large file to blob

我按照这个例子将文件上传到 Azure Blob 存储。 https://dmrelease.blob.core.windows.net/azurestoragejssample/samples/sample-blob.html

    var blobService = AzureStorage.Blob.createBlobServiceWithSas(url, sasKey);
    var customBlockSize = file.size > 1024 * 1024 * 32 ? 1024 * 1024 * 4 : 1024 * 512;
    blobService.singleBlobPutThresholdInBytes = customBlockSize;

    var finishedOrError = false;
    const options = {
        blockSize: customBlockSize
    };
    var speedSummary = blobService.createBlockBlobFromBrowserFile(container, buildBlobName(file), file, options, function (error, result, response) {
        console.log("speedSummary")
        finishedOrError = true;
        if (error) {
            alert('Error');
        } else {
            displayProcess(100);
        }
    });

当我尝试上传小文件 (<512kb) 时,它没有任何错误。但是,我上传了更大的文件 (>512kb),我开始在每个 refreshProgress 中收到错误。这是错误。

PUT https://?????.blob.core.windows.net/images/210815%20bltn_c94e6d0b3f30a.pdf?comp=block&blockid=MWU4YTRjZDktMDAwMDAx&sv=2019-12-12&se=2021-09-12T13%3A06%3A18Z&sr=c&sp=c&sig=QdS%2BjhcLQ4WJXHDjShZSny5F1%2FhSZbl%2Fj6Oq%2B1DMzMA%3D&api-version=2018-03-28x 403 (This request is not authorized to perform this operation using this permission.)
PUT https://?????.blob.core.windows.net/images/210815%20bltn_c94e6d0b3f30a.pdf?comp=block&blockid=MWU4YTRjZDktMDAwMDAx&sv=2019-12-12&se=2021-09-12T13%3A06%3A18Z&sr=c&sp=c&sig=QdS%2BjhcLQ4WJXHDjShZSny5F1%2FhSZbl%2Fj6Oq%2B1DMzMA%3D&api-version=2018-03-28x 403 (This request is not authorized to perform this operation using this permission.)

分段上传似乎失败了。准确地说,当我上传一个大小为 600kb 的文件时,我遇到了两个完全相同的错误 link。每个分段下载的 link 是否应该完全相同? 还是容器中的设置有误? 我在网上看了几个例子。实现方式大致相同。

知道出了什么问题吗?谢谢

问题出在您的共享访问签名 (SAS) 令牌中的权限。

目前您的 SAS 令牌只有 create 权限 (sp=c),它只允许您执行 Put Blob 操作(这就是为什么当您的 blob 大小小于 512KB 时您的请求会成功因为 blob 没有分成块)。

当blob大小大于512KB时,通过将blob拆分成多个chunk(块)来上传blob。在幕后,执行 Put Block REST API 操作。对于 Put Block 操作,您的 SAS 令牌需要 write 权限 (sp=w)。添加此权限后,您应该不会收到此错误。

事实上,在这两种情况下(Put Blob 和 Put Block)仅使用 write 权限就足够了。

更多详情,请看这个link:https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas#permissions-for-a-directory-container-or-blob