微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Blazor 服务器提供并行文件下载流的最佳方式是什么?

如何解决从 Blazor 服务器提供并行文件下载流的最佳方式是什么?

在 blazor 中将文件从服务器下载到客户端时,似乎还没有最佳实践(如果我错了,请纠正我)。一个好的解决方案似乎是实现一个返回文件流的控制器(就像这里完成的那样:How to download in-memory file from Blazor server-side),还有更多涉及 javascript 的面向客户端的解决方案(例如:How can one generate and save a file client side using Blazor?) .然而,这些似乎都不适合我的问题。

我想要的是一个解决方案,让我可以开始从服务器到客户端的大文件并行下载流。目前我正在使用一个控制器,它从内存中的给定目录中获取和压缩文件。我希望用户能够从同一页面客户端启动多个下载流。这目前不适用于我的控制器,因为它重定向用户用户必须等到下载完成才能开始下一个。在 blazor 中提供并行下载的好方法是什么?

这是我目前拥有的(简化版):

控制器:

[ApiController]
[Route("[controller]")]
public class DownloadController : Controller
{
    
    [HttpGet("{directory}/{zipFileName}")]
    [disableRequestSizeLimit]
    public IActionResult DownloadZipFile(string directory,string zipFileName)
    {
        directory = System.Net.WebUtility.UrlDecode(directory);
        if (Directory.Exists(directory))
        {
            using (ZipFile zip = new ZipFile())
            {
                var files = Directory.GetFiles(directory,"*",SearchOption.AllDirectories);
                foreach (var f in files)
                {
                    zip.AddFile(f,Path.GetDirectoryName(f).Replace(directory,string.Empty));
                }
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    zip.Save(memoryStream);
                    return File(memoryStream.ToArray(),"application/zip",String.Format(zipFileName));
                }
            }
        }
        else
        {
            // error handling
        }
    }
}

剃刀页面

<button @onclick="()=>DownloadZip(zipFilePath)">download file</button>

@code {
    protected string zipFilePath= @"C:\path\to\files";

    protected void DownloadZip(string zipFilePath)
    {
        NavigationManager.Navigateto("api/download/" + System.Net.WebUtility.UrlEncode(zipFilePath) + "/ZipFileName.zip",true);
    }

}

解决方法

不要使用按钮和 NavigationManager - 而是使用带有下载属性的锚标记:

<a href=@GetZipURL(zipFilePath) target="_new" download>download file</a>
@code {
    protected string zipFilePath= @"C:\path\to\files";

    protected string GetZipURL(string zipFilePath)
    {
        return $"api/download/{System.Net.WebUtility.UrlEncode(zipFilePath)}/ZipFileName.zip";
    }
}

您的用户可以随心所欲地向该下载“按钮”发送垃圾邮件 - 浏览器将处理并行下载。

如果你想让它看起来像一个按钮,那只是一点 CSS 样式。

注意:GetZipURL 方法只是返回一个字符串 - 它不是重定向或导航。

我使用 target="_new" 来防止 Blazor 拦截事件 - 但从 .NET5 开始不需要这样做。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。