代码之家  ›  专栏  ›  技术社区  ›  conjenks

。NET Core 2 MVC-从Azure Blob存储下载文件在Google Chrome中有效,但在Internet Explorer中无效

  •  4
  • conjenks  · 技术社区  · 7 年前

    要下载的HTML链接:

    <a asp-action="DownloadFile" asp-route-id="@Model.ID">@Html.DisplayFor(model => model.BlobName)</a>
    
    Generated HTML link: http://localhost:50325/DebitMemos/DownloadFile/76
    

    相应的控制器:

    public async Task<IActionResult> DownloadFile(int id)
        {
            var debitMemo = await _context.DebitMemo
                .SingleOrDefaultAsync(m => m.ID == id);
    
            CloudBlockBlob blockBlob;
            MemoryStream ms = new MemoryStream();
            try
            {
                CloudBlobContainer container = DebitMemo.GetAzureContainer();
                blockBlob = container.GetBlockBlobReference(debitMemo.BlobName);
                await container.CreateIfNotExistsAsync();
                // Save blob contents to a file.
                await blockBlob.DownloadToStreamAsync(ms);
    
                Stream blobStream = await blockBlob.OpenReadAsync();
    
                return File(blobStream, blockBlob.Properties.ContentType, debitMemo.BlobName);
            }
            catch (StorageException)
            {
                return Content("File does not exist");
            }
       }
    

    单击Chrome中的链接,会提示您下载文件的位置,然后成功下载。

    另一方面,Internet Explorer(我需要应用程序工作的地方)会说:“您想从localhost打开或保存76(1.54 KB)的文件吗?”

    该示例中的“76”是debitMemo的ID,我不知道为什么它会这样称呼它而不是blobName。然后,当我单击“保存”时,它只会说“76无法下载”没有其他解释。

    如果我还需要提供其他信息,请告诉我。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Andrew Chaa    6 年前

    不要使用MemoryStream。如果这样做,则必须管理该内存流。

    相反,只需打开blob的流并将其连接到ASP。NET的响应流。

    var stream = await blockBlob.OpenReadAsync();
    return File(stream, blockBlob.Properties.ContentType, debitMemo.BlobName);
    
        2
  •  2
  •   Janley Zhang    7 年前

    Internet Explorer无法下载。

    如果索引。Internet临时文件文件夹或Cookies文件夹中的dat文件已标记为只读属性,或者Internet临时文件文件夹太满。

    有一些方法你可以试试。

    1、要解决这个问题,您可以阅读以下内容 article 。这可能与IE设置有关。

    2、也许你把文件保存在 只读 文件夹,因此无法成功保存。您可以尝试另存为其他文件夹。

    如果你说你看到的是id而不是blobName,你可以设置一个断点来检查 debitMemo。BlobName(BlobName) 在你的代码中。请确保它是一个exist blobName。

    此外,如果我在GetBlockBlobReference方法中直接传递一个blob名称,它就可以正常工作。 enter image description here