【问题标题】:Download file from ASP.NET Core api from Blazor client application从 Blazor 客户端应用程序的 ASP.NET Core api 下载文件
【发布时间】:2020-08-31 07:08:18
【问题描述】:

我创建了一个 ASP.NET Core api 控制器,它返回一个 FileStreamResult 对象。 (如果需要,我可以更改结果类型)

Get 函数的代码如下:

[HttpGet("[action]/{p_gInspectionID}/{p_nIndex}")]
public async Task<FileStreamResult> GetInspectionPictureToDownload(Guid p_gInspectionID, int p_nIndex)
{
  var l_strFilePath = await GetPictureFilePathAsync(p_gInspectionID, p_nIndex);

  using (var l_sReader = System.IO.File.OpenRead(l_strFilePath))
  {
    return (File(l_sReader, "image/jpeg"));
  }
}

现在我需要在 Blazor (Webassembly) 客户端应用程序中使用此结果。

我的目标是在用户点击文件时在浏览器中创建一个按钮来启动文件的下载

这应该会启动浏览器的下载功能。 是否可以在 Blazor 客户端应用程序中实现这一点?

【问题讨论】:

    标签: c# asp.net-core client blazor webassembly


    【解决方案1】:

    我不知道事实上你的方式是否可行,但我所做的与我的网站 https://pixeldatabase.net 类似。

    用户点击下载按钮,我显示如下链接:

    public async void Download()
    {
        // Set the ImagePath
        DownloadLink = ImagePath;
    }
    

    然后在页面上,我只显示一个下载链接条件:

    @if  (HasDownloadLink)
    {
        <a class="downloadlink" download="@FileName" href="@DownloadLink" 
    target="_blank">Download</a>
    }
    

    【讨论】:

    • 您好数据杂耍者,感谢您的回答。我想要的是直接开始下载过程,而不是先将文件下载到本地计算机,然后提供该文件的链接。我认为这实际上是你在这里所做的。我的意思是,我想直接使用 FileStreamResult 作为浏览器下载功能的来源。
    • 您是否仍希望为用户显示“另存为”对话框?我唯一能想到的就是保存文件,也许一些 JavaScript 方式可以单击按钮或自动开始下载。
    【解决方案2】:

    这是我解决问题的方法。事实上,解决方案非常简单。感谢@Data Juggler 为我指明了正确的方向。

    我的 Blazor 解决方案包含两个项目:

    • 服务器端 API(Blazor 服务器)
    • 客户端 (Blazor WebAssembly)。

    这是服务器端的代码:

    [AllowAnonymous]
    [HttpGet("[action]/{p_strPictureFilePath}")]
    public IActionResult GetInspectionPicture(string p_strPictureFilePath)
    {
      var l_sReader = System.IO.File.OpenRead(p_strPictureFilePath);
    
      return (File(l_sReader, "application/octet-stream", Path.GetFileName(p_strPictureFilePath)));
    }
    

    ...以及客户端上的代码:

    client-shared.js 文件中添加了这个脚本:

    window.downloadInspectionPicture = function (p_strServerFilePath)
    {
      var link = document.createElement('a');
      link.href = 'api/Data/GetInspectionPicture/' + this.encodeURIComponent(p_strServerFilePath);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    }
    

    当然,index.html 中存在对该文件的引用:

      <script src="client-shared.js"></script>
    

    最后,在 razor 文件中添加一个链接,并在点击链接时调用脚本:

    <a href="javascript:void(0)" @onclick="@(async () => await DownloadPictureAsync())">Download</a>
    
    @code
    {
      [Inject]
      IJSRuntime ThisJSRuntime { get; set; }
    
      private async Task DownloadPictureAsync()
      {
        await ThisJSRuntime.InvokeVoidAsync("downloadInspectionPicture", ServerFilePath);
      }
    }
    

    希望我的回答很清楚,对某人有用

    【讨论】:

      【解决方案3】:

      我试图做同样的事情,但我的 API 已获得授权,因此在阅读此 article 后,我最终在 Web 组装应用程序中下载了字节,并使用 JavaScript 从字节中下载文件。

      function downloadFromByteArray(options: { 
        byteArray: string, 
        fileName: string, 
        contentType: string
      }): void {
      
        // Convert base64 string to numbers array.
        const numArray = atob(options.byteArray).split('').map(c => c.charCodeAt(0));
      
        // Convert numbers array to Uint8Array object.
        const uint8Array = new Uint8Array(numArray);
      
        // Wrap it by Blob object.
        const blob = new Blob([uint8Array], { type: options.contentType });
      
        // Create "object URL" that is linked to the Blob object.
        const url = URL.createObjectURL(blob);
      
        // Invoke download helper function that implemented in 
        // the earlier section of this article.
        downloadFromUrl({ url: url, fileName: options.fileName });
      
        // At last, release unused resources.
        URL.revokeObjectURL(url);
      }
      

      【讨论】:

      • 在我看来这是最好的解决方案,谢谢您的建议
      • 通过互联网下载大文件,总是有缺点的。用这种方法分割块也很困难。
      猜你喜欢
      • 2020-05-30
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多