【问题标题】:.NET Core 2 MVC - Downloading file from Azure Blob Storage works in Google Chrome but not in Internet Explorer.NET Core 2 MVC - 从 Azure Blob 存储下载文件适用于 Google Chrome,但不适用于 Internet Explorer
【发布时间】:2018-08-13 17:46:10
【问题描述】:

要下载的 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 无法下载”。没有其他解释。

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

【问题讨论】:

    标签: c# asp.net-mvc internet-explorer azure-blob-storage


    【解决方案1】:

    Internet Explorer 无法下载。

    如果 Internet 临时文件文件夹或 Cookies 文件夹中的 Index.dat 文件被标记为只读属性,或者 Internet 临时文件文件夹太满,则会出现此问题。

    您可以尝试一些方法。

    1.要解决这个问题,你可以阅读这个article。可能和IE设置有关。

    2.可能你将文件保存在只读文件夹中,所以无法保存成功。您可以尝试另存为另一个文件夹。

    3.您说您看到的是 id 而不是 blobName,您可以设置一个断点来检查代码中 debitMemo.BlobName 的值。请确保它是一个存在的 blobName。

    此外,如果我直接在 GetBlockBlobReference 方法中传递一个 blob 名称,它工作正常。

    【讨论】:

    • 一会,我病了,刚回去工作!
    【解决方案2】:

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

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

    var stream = await blockBlob.OpenReadAsync();
    return File(stream, blockBlob.Properties.ContentType, debitMemo.BlobName);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2015-03-16
      • 1970-01-01
      相关资源
      最近更新 更多