使用 AspNet 从 Azure Blob 存储下载和重命名文件
Download and Rename Files from Azure Blob Storage with AspNet
我正在开发一个网络平台来管理 upload/download 文件。前端使用 React 开发,后端使用 ASP.NET,Azure Blob Containers 用于存储上传的文件。
至于上传,我正在使用微软的“Azure Storage Client Library”通过 SAS 身份验证将文件直接从客户端发送到 Azure。这个 Javascript 库允许我在整个过程中更新进度条。
关于下载,过程比较复杂:文件先从服务器下载(阶段1或Azure->服务器),然后从客户端下载(阶段2或服务器->客户端) .第一阶段给我带来了两个问题:
- 我无法显示进度条来检查进度;
- 这可能需要很长时间,在此阶段,客户端无法开始下载;
为了解决这些问题,我想要以下解决方案之一:
- 使用 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);
}
为了使用 Content-Disposition
,您需要在 blob 上生成 SAS 令牌(目前您正在 blob 容器上创建 SAS 令牌)。然后您需要使用 SharedAccessBlobHeaders
并在那里定义内容配置值。
这是示例代码(虽然未经测试):
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);
}
我正在开发一个网络平台来管理 upload/download 文件。前端使用 React 开发,后端使用 ASP.NET,Azure Blob Containers 用于存储上传的文件。
至于上传,我正在使用微软的“Azure Storage Client Library”通过 SAS 身份验证将文件直接从客户端发送到 Azure。这个 Javascript 库允许我在整个过程中更新进度条。
关于下载,过程比较复杂:文件先从服务器下载(阶段1或Azure->服务器),然后从客户端下载(阶段2或服务器->客户端) .第一阶段给我带来了两个问题:
- 我无法显示进度条来检查进度;
- 这可能需要很长时间,在此阶段,客户端无法开始下载;
为了解决这些问题,我想要以下解决方案之一:
- 使用 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);
}
为了使用 Content-Disposition
,您需要在 blob 上生成 SAS 令牌(目前您正在 blob 容器上创建 SAS 令牌)。然后您需要使用 SharedAccessBlobHeaders
并在那里定义内容配置值。
这是示例代码(虽然未经测试):
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);
}