【问题标题】:Cannot upload file to Azure Blob Node.js无法将文件上传到 Azure Blob Node.js
【发布时间】:2021-12-30 08:39:37
【问题描述】:

尝试在 nodejs 中使用 @azure/storage-blob sdk 将文件上传到 azure blob 存储:

module.exports.createBlob = (blobName, containerName, blobContent) => {
  return new Promise(async (resolve, reject) => {
    try {
      const sharedKeyCredential = await this.createSharedAccessToken(blobName, 'c')
      const blobServiceClient = new BlobServiceClient(
    `https://${process.env.AZURE_BLOB_ACCOUNT}.blob.core.windows.net`,
    sharedKeyCredential
      )
      const containerClient = blobServiceClient.getContainerClient(containerName)
      const blockBlobClient = containerClient.getBlockBlobClient(blobName)
      const blob = await blockBlobClient.upload(blobContent, blobContent.length) // implement later
      resolve(blob)
    } catch (err) {
      console.log(err)
      reject(err)
    }
  })
}

module.exports.createSharedAccessToken = (blobName, permission) => {
  return new Promise(async (resolve, reject) => {
    const sharedKeyCredential = new StorageSharedKeyCredential(process.env.AZURE_BLOB_ACCOUNT, process.env.AZURE_BLOB_KEY)
    const containerName = process.env.AZURE_CONTAINER_NAME
    const startsOn = new Date()
    expiresOn.setMinutes(expiresOn.getMinutes() + parseInt(autoLogoutDuration.KeyValue))
    const blobSAS = generateBlobSASQueryParameters({
      containerName, // Required
      blobName, // Required
      permissions: BlobSASPermissions.parse(permission), // Required
      startsOn: startsOn, // Required
    },
    sharedKeyCredential // StorageSharedKeyCredential - `new StorageSharedKeyCredential(account, accountKey)`
    ).toString()
    resolve(decodeURI(blobSAS))
})
}

它不断抛出“NoAuthenticationInformation”错误。相同的凭据可用于下载现有的 blob,但无论我尝试什么上传都无法正常工作。任何帮助将不胜感激。

【问题讨论】:

标签: node.js azure


【解决方案1】:

在此MS DOC 之后,我尝试重现您的问题,但能够使用 Node.js 将文件上传到我的 azure blob 容器中,而不会出现任何身份验证错误。

当您使用共享密钥凭证时,我们需要在我们的门户中拥有所有这些权限,如下所示:

我也在nodejs 中使用@azure/storage-blob sdk 在我的package.json 中。

还在我的testupload.js 文件中添加了@azure/storage-blob sdk

并将以下代码添加到我的testupload.js 文件中,因为我已经创建了容器,我刚刚评论了上面的屏幕截图代码。

const  account="testa";

const  sharedKeyCredential = new  StorageSharedKeyCredential("yourstorageaccountname", "your storage key connection string");

const  blobServiceClient1 = new  BlobServiceClient(

// When using AnonymousCredential, following url should include a valid SAS or support public access

`https://${account}.blob.core.windows.net`,

sharedKeyCredential

);

  

const  blobnewname="example2.txt"

blobContent="hi hello";

const  containerClient1 = blobServiceClient.getContainerClient("test")

const  blockBlobClient1= containerClient.getBlockBlobClient(blobnewname)

const  blob = blockBlobClient1.upload(blobContent, blobContent.length)

然后我可以测试我的文件并将其上传到 Azure blob 容器 以下是截图供参考:

有关更多信息,请参阅此 MS DOC:Azure Storage samples using v12 JavaScript client libraries

更新:- 正如@Setanjan Roy 所建议的那样

另一种方式:- 为了摆脱这个,我们可以使用 new BlobServiceClient(https://${process.env.AZURE_BLOB_ACCOUNT}.blob.core.windows.net${sharedKeyCredential})

【讨论】:

  • 我很确定我使用的凭据具有必要的权限,因为使用 Angular 的前端团队能够轻松上传文件。我实际上能够通过查看他们的代码来解决这个问题。问题是如何将 sas 传递给 blob 服务客户端构造函数。以下是我的做法: new BlobServiceClient(https://${process.env.AZURE_BLOB_ACCOUNT}.blob.core.windows.net${sharedKeyCredential}) 不知怎的。
猜你喜欢
  • 2013-01-01
  • 2011-02-07
  • 1970-01-01
  • 2017-03-14
  • 2020-06-12
  • 2013-10-04
  • 2019-10-31
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多