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)。。。。


   

原创粉丝点击