使用流下载文件需要注意的是ajax发送的请求不能浏览器响应,需要使用http请求发送。原因是因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。还有a其他人是认为ajax方式请求的数据只能存放在javascipt内存空间,可以通过javascript访问,但是无法保存到硬盘,因为javascript不能直接和硬盘交互,否则将是一个安全问题。
这里写一个前后台的例子来说明如何使用http请求来从服务器tomcat中下载一个word文件。
前台代码
url指的是将要发送到后台的URL,使用form表单来提交
var form = $("<form></form>");
form.attr("style","display:none");
form.attr("target","_blank");
form.attr("method","post");
form.attr("action",url);
$(document.body).append(form);
form.submit();
后台代码
在tomcat对应的路径下放置所需要的文件
@requestMapping("downloadWord")
public void download(HttpServletRequest request,HttpServletResponse response, String fileName) throws IOException{
//上传的文件是保存在/WEB-INF/upload目录下
String fileSaveRootPath = request.getServletContext().getRealPath("/WEB-INF/upload/test.docx");
//得到要下载的文件
File file = new File(fileSaveRootPath);
//如果文件不存在
if(!file.exists()){
request.setAttribute("message", "您下载的资源已被删除");
return;
}
//处理文件名
String realname = "test.docx";
//设置响应头,控制浏览器下载该文件
response.setHeader("content-Disposition", "attachment;filename="+URLEncoder.encode(realname,"UTF-8"));
//读取要下载的文件,保存到文件输入流
FileInputStream in = new FileInputStream(fileSaveRootPath);
//创建输出流
OutputStream out = response.getOutputStream();
//创建缓冲区
byte buffer[] = new byte[1024];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len = in.read(buffer))>0){
//输出缓冲区的内容到浏览器,实现文件下载
out.write(buffer,0,len);
}
//关闭文件输入流
in.close();
//关闭输出流
out.close();
}