使用 AspNet 从 Azure Blob 存储下载和重命名文件
Posted
技术标签:
【中文标题】使用 AspNet 从 Azure Blob 存储下载和重命名文件【英文标题】:Download and Rename Files from Azure Blob Storage with AspNet 【发布时间】:2020-10-24 01:46:12 【问题描述】:我正在开发一个网络平台来管理文件的上传/下载。前端使用 React 开发,后端使用 ASP.NET 和 Azure Blob Containers 存储上传的文件。
至于上传,我使用微软“Azure 存储客户端库”通过 SAS 身份验证将文件直接从客户端发送到 Azure。这个 javascript 库允许我在整个过程中更新进度条。
至于下载,过程比较复杂:首先从服务器(阶段1或Azure->Server)下载文件,然后从客户端(阶段2或Server->Client)下载文件。第 1 阶段给我带来了两个问题:
我无法显示进度条来检查进度; 可能需要很长时间,在此阶段,客户端无法开始下载;为了解决这些问题,我想要以下解决方案之一:
使用 Javascript 库直接从客户端下载文件,但在这种情况下需要重命名文件; 创建服务器-客户端通信以实现与阶段 1 相关的进度条;这是我当前允许下载文件的 C# 函数
using Microsoft.WindowsAzure.Storage.Blob;
private IActionResult DownloadFile(...)
...
using (var blobStream = new MemoryStream())
string blobName = ...
CloudBlobContainer cloudBlobContainer = ...
CloudBlockBlob blob = cloudBlobContainer.GetBlockBlobReference(blobName);
blob.DownloadToStream(blobStream);
return new FileContentResult(blobStream.ToArray(), "application/pdf");
编辑:
在我用来生成 SAS 令牌的代码下方:
private string GetSasReadToken(string connectionString, string containerName)
var storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference(containerName);
var sasConstraints = new SharedAccessBlobPolicy
SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(60),
Permissions = SharedAccessBlobPermissions.Read
;
var sasContainerToken = cloudBlobContainer.GetSharedAccessSignature(sharedAccessBlobPolicy);
【问题讨论】:
如果你直接通过浏览器下载文件而不是先使用客户端JS在你的应用程序中下载然后保存在本地计算机上可以吗?或者换句话说,让浏览器而不是您的应用程序来处理下载。 为什么要先下载文件到你的服务器,而不是让客户端直接下载到自己的机器上? 我需要重命名文件,这就是我使用后端函数的原因。重命名必须适用于所有主要浏览器(Chrome、Firefox、Edge 和 Safari) 您可以覆盖 SAS URL 中的Content-Disposition
标头并指定下载文件名。
感谢您的回答。可以在客户端修改内容处理器吗?还是需要设置 SAS 令牌?我使用 CloudBlobContainer.GetSharedAccessSignature 方法生成令牌,但它似乎不允许我更改响应标头
【参考方案1】:
为了使用Content-Disposition
,您需要在 blob 上生成 SAS 令牌(目前您正在 blob 容器上创建 SAS 令牌)。然后你需要使用SharedAccessBlobHeaders
并在那里定义 content-disposition 值。
这是示例代码(虽然未经测试):
private string GetSasReadToken(string connectionString, string containerName, string blobName)
var storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference(containerName);
CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(blobName);
var sasConstraints = new SharedAccessBlobPolicy
SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(60),
Permissions = SharedAccessBlobPermissions.Read,
;
var sasHeaders = new SharedAccessBlobHeaders();
sasHeaders.ContentDisposition = "attachment;filename=<your-download-file-name>";
var sasBlobToken = cloudBlockBlob.GetSharedAccessSignature(sharedAccessBlobPolicy, sasHeaders);
【讨论】:
完美运行,谢谢!我只需要将“附件;文件 =”更改为“附件;文件名 =”以上是关于使用 AspNet 从 Azure Blob 存储下载和重命名文件的主要内容,如果未能解决你的问题,请参考以下文章
我们如何使用代理和 NodeJS 从 azure 存储下载 blob?
使用 azure 逻辑应用将 blob 从 azure 存储帐户动态发送到电子邮件