[英]DownloadRangeToStreamAsync and File Save using ASP.NET and MVC5
我正在尝试以CloudBlockBlob
的形式从Azure存储下载文件。 我想允许用户选择将下载的文件放在哪里,因此我编写了以下代码
[AllowAnonymous]
public async Task<ActionResult> DownloadFile(string displayName)
{
ApplicationUser user = null;
if (ModelState.IsValid)
{
user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
// Retrieve storage account and blob client.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
ConfigurationManager.AppSettings["StorageConnectionString"]);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(
VisasysNET.Utilities.Constants.ContainerName);
// If the container does not exist, return error.
if (container.Exists())
{
foreach (IListBlobItem item in container.ListBlobs(null, false))
{
if (item.GetType() == typeof(CloudBlockBlob))
{
CloudBlockBlob blob = (CloudBlockBlob)item;
if (blob.Name.CompareNoCase(displayName))
{
using (Stream stream = new MemoryStream())
{
await blob.DownloadRangeToStreamAsync(stream, null, null);
return File(stream, displayName);
}
}
}
}
return RedirectToAction("Index", "Tools");
}
}
return new HttpStatusCodeResult(HttpStatusCode.ServiceUnavailable);
}
这个想法是返回FileStreamResult
并允许浏览器提供“保存对话框”。 但是,当控制器发布到视图时,
无法访问关闭的流。 异常详细信息:System.ObjectDisposedException:无法访问关闭的Stream。
现在,问题很明显了,但是,如何解决这个问题尚不明确。 我想确保MemoryStream
被释放和处置,因为它可能会保存高达约10M的数据。 如何处置MemoryStream
但允许FileStreamResult
传回并由浏览器使用?
谢谢你的时间。
根本就不要处置它。 看一下FileStreamResult
实现 :
protected override void WriteFile(HttpResponseBase response) {
// grab chunks of data and write to the output stream
Stream outputStream = response.OutputStream;
using (FileStream) {
byte[] buffer = new byte[_bufferSize];
while (true) {
int bytesRead = FileStream.Read(buffer, 0, _bufferSize);
if (bytesRead == 0) {
// no more data
break;
}
outputStream.Write(buffer, 0, bytesRead);
}
}
}
FileStreamResult在将其流写入response.OutputStream
之后将对其进行response.OutputStream
;
如果您不必通过网站代理下载内容(安全性),则可以生成共享访问签名并将用户直接重定向到存储。 看这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.