什么是从服务器下载文件的最佳方法?

16

我有一个有趣的任务,需要从服务器(ASP.NET)下载一个动态生成的文件到客户端。在客户端上只使用JavaScript(jQuery),客户端可以生成许多参数来定制数据的导出方式。

最佳的方法是什么来从服务器下载文件?我应该使用像这个描述的WCF服务还是像这个简单页面?

我不知道如何在不重新加载页面的情况下下载文件(我不确定$.ajax在这种情况下是否起作用)。请问有人能在这个问题上给我一些指导吗?谢谢。


2
我认为这与此问题/答案有关:https://dev59.com/Q2865IYBdhLWcg3wkfcW - Ali Almahdi
1个回答

20

首先,您可以从处理程序 .ashx 中创建该文件。

假设您要从 JavaScript 传递一些参数,例如 download.ashx?p1=8827&p2=8831,以知道要创建什么文件。

然后您可以在 JavaScript 中使用重定向来执行操作:

window.location = "download.ashx?p1=8827&p2=8831";

或者你可以使用window.open来做同样的事情。

window.open("download.ashx?p1=8827&p2=8831");

然后你的文件就会开始下载。

只需确保在处理程序中设置了附件的头部和正确的内容类型,例如:

  HttpContext.Current.Response.ContentType = "application/octet-stream";
  HttpContext.Current.Response.AddHeader("Content-Disposition", 
                    "attachment; filename=" + SaveAsThisFileName);

简单明了,已经经过测试并且可行。

你可能也对这个答案感兴趣:如何处理错误


你如何进行错误处理?例如,如果在 .ashx 文件中抛出异常,你会如何处理? - Steve
1
@Steve 如果出现错误,你应该抛出“页面未找到”的异常,记录错误并修复它。 - Aristos
@BogdanM。你可以缩短它,发送一个ID,而不是完整的URL。这是一个不同的问题需要解决/处理,你不能避免 - 但并不难。 - Aristos
我只是想知道建议的解决方案是否仍然是最佳的。现代大多数浏览器都启用了弹出窗口拦截器。因此,我认为在此提出的重定向作为接受的方法并不是最正确的解决方案。我遇到了同样的问题,所以如果有人能给出反馈,我将不胜感激。 - gkoul
@GrigoriosKoulouras window.location 没有弹出任何内容,而是开始下载。 - Aristos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接