首页 > 解决方案 > 将相同的文件上传到 Azure Blob 存储而不覆盖?

问题描述

我正在使用 Azure 存储 JavaScript 客户端库通过引用此链接 https://dmrelease.blob.core.windows.net/azurestoragejssample/samples/sample-blob.html将文件上传到 azure 存储

下面的代码是我上传到天蓝色存储的片段(它需要文件并将其存储在存储中)

var speedSummary = blobService.createBlockBlobFromBrowserFile('mycontainer', file.name, file, {blockSize : customBlockSize}, function(error, result, response) {
    finishedOrError = true;
    if (error) {
        // Upload blob failed
    } else {
        // Upload successfully
    }
});

主要问题是当我再次上传相同的文件时。它正在覆盖文件。是否可以添加任何属性或标题以防止覆盖。我也希望在不覆盖的情况下存储重复文件

请帮我解决这个问题。提前致谢。

标签: javascriptazureazure-blob-storage

解决方案


是否可以添加任何属性或标题以防止覆盖。

绝对地。您可以使用as 值指定EtagNonMatch访问条件。*从文档中link

如果 blob 的 ETag 与指定的 ETag 不匹配。指定通配符 (*) 以仅在资源不存在时执行操作,如果资源存在则操作失败。

如果存在同名的 blob,这将导致 blob 上传失败。访问条件可以在accessConditionsoptions 参数中指定。

您可以在此处了解有关 Blob 存储中条件标头支持的更多信息:https ://docs.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations 。

我也希望在不覆盖的情况下存储重复文件

这是您需要自己处理的事情。如果由于 Blob 已存在而导致 Blob 上传失败,您将收到Pre Condition Failed (HTTP Status Code 412)错误消息。基于此错误,您需要为 blob 提供一个新名称并再次上传。

更新

这是您可以使用的代码(未经测试):

var options = {
  blockSize : customBlockSize,
  accessConditions: {
    EtagNonMatch: '*'
  }
};
var speedSummary = blobService.createBlockBlobFromBrowserFile('mycontainer', file.name, file, options, function(error, result, response) {
    finishedOrError = true;
    if (error) {
        // Upload blob failed
    } else {
        // Upload successfully
    }
});

推荐阅读