无法将文件上传到 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 存储
从 react js / node js 将文件对象上传到天蓝色存储