为什么使用ajax请求无法下载文件?

在我们的应用程序中,我们需要实现以下场景

  1. 请求是从客户端发送的
  2. 服务器处理请求并生成文件
  3. 服务器返回文件作为回应
  4. 客户端浏览器显示文件下载popup对话框,并允许用户下载文件

我们的应用程序是基于ajax的应用程序,所以发送ajax请求(比如使用jquery.ajax()函数)会非常简单方便。

但googilng后,事实certificate,文件下载只有在使用非Ajax POST请求(如在这个stream行的SO线程中描述)才有可能。 所以我们需要实现更复杂,更复杂的解决scheme,需要使用嵌套隐藏字段来构buildform HTML结构。

有人可以用简单的语言解释为什么ajax请求不能用于下载文件? 那背后的机制是什么?

这不是关于AJAX。 当然,您可以使用AJAX下载文件。 但是,文件将保存在内存中,即不能将文件保存到磁盘。 这是因为JavaScript不能与磁盘交互。 这将是一个严重的安全问题,并在所有主stream浏览器中被阻止。

这可以使用称为Blob的新的HTML5function来完成。 有一个库FileSaver.js ,可以用作该function顶部的包装。

这是两天前我问过自己的同样的问题。 有一个使用ExtJS编写的客户端项目,服务器端实现在ASP.Net上。 我必须将服务器端转换为Java。 有一个函数可以下载一个XML文件,该服务器在客户端发出Ajax请求后生成。 我们都知道,Ajax请求下载文件是不可能的,只是将其存储在内存中。 但是…在原来的应用程序浏览器显示通常的对话框打开选项,保存和取消下载。 ASP.Net以某种方式改变了标准的行为…它需要我两天来再次certificate – 没有办法通过请求通常的方式下载文件…唯一的例外是ASP.Net …这里是ASP.Net码

 public static void WriteFileToResponse(byte[] fileData, string fileName) { var response = HttpContext.Current.Response; var returnFilename = Path.GetFileName(fileName); var headerValue = String.Format("attachment; filename={0}", HttpUtility.UrlPathEncode( String.IsNullOrEmpty(returnFilename) ? "attachment" : returnFilename)); response.AddHeader("content-disposition", headerValue); response.ContentType = "application/octet-stream"; response.AddHeader("Pragma", "public"); var utf8 = Encoding.UTF8; response.Charset = utf8.HeaderName; response.ContentEncoding = utf8; response.Flush(); response.BinaryWrite(fileData); response.Flush(); response.Close(); } 

这个方法是从WebMethod调用的,而这个方法又是从ExtJS.Ajax.request中调用的。 这是魔法。 对我来说,我已经用servlet和隐藏的iframe结束了…

你可以在你的下载页面使用隐藏的iframe来做到这一点

只需在你的ajax成功响应中设置隐藏的ifame的src,你的任务完成了…

  $.ajax({ type: 'GET', url: './page.php', data: $("#myform").serialize(), success: function (data) { $("#middle").attr('src','url'); }, });