无法将文件上传到 Azure Blob Node.js

Posted

技术标签:

【中文标题】无法将文件上传到 Azure Blob Node.js【英文标题】:Cannot upload file to 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,但无论我尝试什么上传都无法正常工作。任何帮助将不胜感激。

【问题讨论】:

可以参考Avoiding “AuthorizationFailed” error when hand-crafting Shared Access Signature for Azure Storage、How to upload images and files to Azure Blob Node.js和Stream uploaded file to Azure blob storage with Node 【参考方案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) 不知怎的。

以上是关于无法将文件上传到 Azure Blob Node.js的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Azure.Storage.Blobs NuGet 包将文件上传到 Azure Blob 存储

将图像上传到 Azure Blob 存储

从 react js / node js 将文件对象上传到天蓝色存储

文件目录无法从 apache camel 上传 azure blob 上的文件

使用文件流压缩文件并上传到 Azure Blob 存储

使用 node.js 将 Azure 文件共享复制到 Blob