【问题标题】:Azure storage avoid uploading file if name already exists如果名称已存在,Azure 存储避免上传文件
【发布时间】:2020-12-01 00:49:21
【问题描述】:

我正在尝试将文件上传到 Azure 存储。我使用包multer-azure 让它工作,但是如果我上传一个与已存储在存储中的文件同名的文件,第一个文件将被替换。

从文档看来我需要添加一个ETagMatch,但我不确定这应该去哪里。

https://azure.github.io/azure-storage-node/global.html#AccessConditions

我的代码:

      var upload = multer({
        storage: multerAzure({
            account: STORAGE_ACCOUNT_NAME, //The name of the Azure storage account
            key: ACCOUNT_ACCESS_KEY, //A key listed under Access keys in the storage account pane
            container: 'demo',  //Any cntainer name, it will be created if it doesn't exist
            blobPathResolver:  (_req, file, callback) => {
                let path;
                if(_req.body.pathToFile) {
                    path = `${organization}/${_req.body.pathToFile}/${file.originalname}`
                } else {
                    path = `${organization}/${file.originalname}`;
                }
                // var blobPath = yourMagicLogic(req, file); //Calculate blobPath in your own way.
                callback(null, path);
            }
        })
    }).single('file')

    upload(req, res, function (err) {
        if (err instanceof multer.MulterError) {
            return res.status(500).json(err)
        } else if (err) {
            return res.status(500).json(err)
        }
        return res.status(200).send(req.file)
    })

【问题讨论】:

  • 在允许上传之前检查文件是否存在如何正确?
  • 同样从客户端执行此操作(看起来这就是您正在执行的操作)会暴露您的存储密钥,这意味着任何人都可以获取它并复制/删除所有内容。
  • @DanielBjörk 我实际上还没有在 API 中看到该文件存在检查?不,这不是浏览器代码它的节点(multer 甚至不存在于客户端..0
  • 有很多方法,例如。您可以使用 Get Blob Properties 查看它是否存在。 docs.microsoft.com/en-us/rest/api/storageservices/…
  • 检查客户端中是否存在 blob,如果不存在则上传它可能不会剪切它,具体取决于场景。在可能有多个节点运行此代码的服务中,您将在检查和上传之间存在竞争条件,这可能会导致您覆盖现有文件。

标签: javascript node.js azure azure-storage


【解决方案1】:

如果服务上已经存在 blob,它将被覆盖。您可以简单地使用 SDK 的 doesBlobExist 方法来检查 NodeJS 中的路径中是否存在 blob。如果不存在,您可以将文件上传到 Azure 存储。

var blobService = azure.createBlobService(storageAccount, accessKey);
blobService.doesBlobExist('azureblob', 'xxx/a.json', function(error, result) {
  if (!error) {
    if (result.exists) {
      console.log('Blob exists...');
    } else {
      console.log('Blob does not exist...');
    }
  }
});

【讨论】:

  • 这会导致竞争条件 - 如果其他服务在检查 blob 是否存在和上传之间上传 blob,您将覆盖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2023-04-06
相关资源
最近更新 更多