今天接到任务,完成一个文件下载的工作。一开始使用ajax请求,后台程序使用servlet,结果无论如何都不能下载成功,网上查了一下才知道,ajax无法处理文件传输。
原因是:ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的发送,接受都只能是string字符串,不能流类型,所以无法实现文件下载,强用会出现response冲突。
解决办法:模拟表单来提交请求即可
前台代码如下:
doClick(){ var url = "http:xxxxxxxxxxxx"; form.appendTo('body').submit().remove(); |
}
这样就提交了
后台代码如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); CloseableHttpResponse response1 = null; String api = request.getParameter("api"); String responseJson = null; if(api.equals("0")){ //获得请求文件名 String fid = request.getParameter("fid"); String oid = request.getParameter("oid"); String num = request.getParameter("num"); String filename =new String(request.getParameter("filename").getBytes("iso8859-1"),"utf-8"); //设置响应头,对文件进行url编码 filename = URLEncoder.encode(filename, "UTF-8"); System.out.println(filename); String syspath = "C:/org_spaces"; String destination = syspath + "/" + oid + "/am/emltp/"+fid; String suffix = filename.substring(filename.lastIndexOf(".")); String fname = fid + "_" + num+suffix; String path = destination+"/"+fname; //设置文件MIME类型 response.setContentType(getServletContext().getMimeType(filename)); //设置Content-Disposition response.setHeader("Content-Disposition", "attachment;filename="+filename); //读取目标文件,通过response将目标文件写到客户端 //System.out.println(fullFileName); //读取文件 InputStream in = new FileInputStream(path); OutputStream out = response.getOutputStream(); //写文件 int b; while((b=in.read())!= -1) { out.write(b); } in.close(); out.close(); } } |