从 MVC 控制器返回 FileStreamResult 时,文件大小变为零

本文关键字:文件大小 MVC 控制器 返回 FileStreamResult | 更新日期: 2023-09-27 18:32:10

我正在尝试以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))
                    {
                        string contentType = String.Format(
                            "application/{0}", 
                            Path.GetExtension(displayName).TrimStart('.'));
                        // No need to dispose, FileStreamResult will do this for us.
                        Stream stream = new MemoryStream();
                        await blob.DownloadRangeToStreamAsync(stream, null, null);
                        return File(stream, contentType, displayName);
                    }
                }
            }
            return RedirectToAction("Index", "Tools");
        }
    }
    return new HttpStatusCodeResult(HttpStatusCode.ServiceUnavailable);
}

这会从 blob 存储中下载文件,但当控制器使用 FileStreamResult 返回到视图时,浏览器将按预期启动保存文件对话框,但文件大小为 0 字节。Stream显示正确的文件大小,但是当我这样做时

 return File(stream, contentType, displayName);

数据似乎没有传递到"保存"对话框。

如何让文件正确保存?

谢谢你的时间。

从 MVC 控制器返回 FileStreamResult 时,文件大小变为零

DownloadRangeToStreamAsync之后的内存流位置将位于最后一个字节上。在返回之前将其设置回开头。

stream.Seek(0,0)