JAVA实现文件下载,浏览器端得到数据流没生产文件
来源:互联网 发布:php分割 编辑:程序博客网 时间:2024/06/06 09:51
前台提交请求,到后台获取需要下载的文件生产流下载文件时, 浏览器端没有生产对应的文件,只获取了文件流。
再网上搜了一圈, 很多说在java端需要对response.setContentType() 进行设置, 但是我设置完成后依然 没有效果。
到不是此设置无效, 而是问题出在提交请求的方式。
如果是通过流的方式下载文件时,提交方式必须为 http请求,而不能是ajax请求。
具体代码:
前台js部分
// 根据业务编号下载附件 使用form提交 function downLaodFiles(scode){ // 路径 var urlStr1 ="${base}/deliveryplanSupplierSell!downLoadFilesBySellCode.dhtml?sellcode="+scode; //form提交下载var form = $('<form></form>'); form.attr('style', 'display:none'); form.attr('target', '_blank'); form.attr('method', 'post'); //form提交路径 form.attr('action', urlStr1)var input = $('<input type="text" name="params" id="params" />'); // 可以添加一些参数 input.attr('value', scode);form.append(input); $(document.body).append(form);form.submit(); }
后台java代码:
/** * @version 1.0 * @Classname downLoadFilesBySellCode * @description 根据业务编号从webservice获取下载文件 * @author 吴文进 * @throws IOException * @date 2017年2月17日09:56:00 */@SuppressWarnings("unused")public String downLoadFilesBySellCode() throws IOException{// 业务编号String sellcode = request.getParameter("sellcode");// 调用webservice 接口,获取需要下载的附件信息List<String> urlList = getDownLoadUrlByWebservice(sellcode);// 以流的形式下载文件ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());// 获取邮件名称用作下载压缩包名称String zipName = sellcode+".zip"; try { response.setContentType("application/octet-stream"); String userAgent = request.getHeader("User-Agent").toLowerCase(); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipName, "utf-8")); // 保存所有附件名称, 用于判断下载附件名称是否重复, 防止打包时出错。 String fileNames = ""; // 重复数 int cNum = 0 ; for (int i = 0; i < urlList.size(); i++) { /*// 转换前文件名 String fileName = urlList.get(i).substring(urlList.get(i).lastIndexOf("/")+1, urlList.get(i).length()); // 路径名 String pathName = urlList.get(i).substring(0,urlList.get(i).lastIndexOf("/")+1); // 处理路径名中的空格 pathName = pathName.replace(" ", "%20"); String newFileName = ""; try { newFileName = URLEncoder.encode(fileName,"UTF-8");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch block e.printStackTrace();} newFileName = newFileName.replace("+", "%20"); URL url = new URL(pathName+newFileName);*/ URL url = new URL(urlList.get(i)); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置超时间为3秒 conn.setConnectTimeout(60*1000); //防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到输入流 InputStream inputStream = conn.getInputStream(); // 如果重复, 则名称后面添加(1) /* if(fileNames.contains(fileName)){ String fileType = fileName.substring(fileName.lastIndexOf(".")+1,fileName.length()); String name = fileName.substring(0,fileName.lastIndexOf(".")); fileName = name + "("+ ++cNum +")." +fileType; } fileNames += fileName +",";*/ // 将单个文件放进压缩包中 //tempName=tempName.replace("%20"," "); // 附件名 String tempName = urlList.get(i).substring(urlList.get(i).lastIndexOf("/")+1, urlList.get(i).length()); if(fileNames.contains(tempName)){ String fileType = tempName.substring(tempName.lastIndexOf(".")+1,tempName.length()); String name = tempName.substring(0,tempName.lastIndexOf(".")); tempName = name + "("+ ++cNum +")." +fileType; } fileNames += tempName +","; zos.putNextEntry(new ZipEntry(tempName)); byte[] buffer = new byte[1024]; int r = 0; while ((r = inputStream.read(buffer)) != -1) { zos.write(buffer, 0, r); } inputStream.close(); } zos.flush(); zos.close(); } catch (Exception e) { e.printStackTrace(); } finally { } return null;}
该代码下载为下载多个文件时,打包为一个压缩包下载,如果压缩包中的附件名称有重复的则在名称后面添加(1)(2)。。。。
阅读全文
1 0
- JAVA实现文件下载,浏览器端得到数据流没生产文件
- java实现浏览器下载excel文件
- asp.net 实现数据流文件下载
- java浏览器下载文件
- 使用数据流下载文件
- 使用数据流下载文件
- java实现浏览器下载文件,并解决兼容各浏览器的文件下载中文乱码
- springmvc实现浏览器下载文件
- java端实现文件下载
- IE浏览器下点击下载文件没反应
- Java Web实现使用浏览器下载文件代码
- JAVA实现下载浏览器可以识别的TXT等文件。
- Java Web实现使用浏览器从服务器下载文件(后台)
- 浏览器编程中如何得到下载文件的通知?
- 使用数据流进行文件下载
- java文件之数据流
- java 数据流读取文件
- java实现文件下载
- Dlib库【2】——Socket相关
- android各版本特性
- 小技巧:两种方式快速实现平滑涂鸦画板
- php数据库操作——新数据插入到MySQL
- Unity 学习笔记 2
- JAVA实现文件下载,浏览器端得到数据流没生产文件
- 通达OA 工作流执行出现的异常现象处理(图文)
- Java关于Properties用法的总结(一)
- 关于C++兼容C,C++在linux程序设计API的调用等问题
- vue2.0的组件联合变化
- 下载别人vue项目,执行npm run dev报错解决方案
- org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree []
- jsp的指令
- React 基础优化方式