从 Blazor Server 提供并行文件下载流的最佳方式是什么?
What is the best way to offer parallel file download streams from Blazor Server?
在 blazor 中将文件从服务器下载到客户端时,似乎还没有最佳实践(如果我错了请纠正我)。一个好的解决方案似乎是实现一个 returns 文件流的控制器(就像这里所做的那样:), there are also more client-side oriented solutions that involve javascript (like these: )。然而,None 这些似乎完全符合我的问题。
我想要的是一种解决方案,可以让我开始从服务器到客户端并行下载大文件流。目前我正在使用一个控制器,它从内存中的给定目录中获取和压缩文件。我希望用户能够从同一页面客户端启动多个下载流。这目前不适用于我的控制器,因为它会重定向用户并且用户必须等到下载完成才能开始下一个。在 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 开始不需要这样做。
在 blazor 中将文件从服务器下载到客户端时,似乎还没有最佳实践(如果我错了请纠正我)。一个好的解决方案似乎是实现一个 returns 文件流的控制器(就像这里所做的那样:
我想要的是一种解决方案,可以让我开始从服务器到客户端并行下载大文件流。目前我正在使用一个控制器,它从内存中的给定目录中获取和压缩文件。我希望用户能够从同一页面客户端启动多个下载流。这目前不适用于我的控制器,因为它会重定向用户并且用户必须等到下载完成才能开始下一个。在 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 开始不需要这样做。