java浏览器文件打包下载过程解析
最近,在项目中遇到了需要将一系列的图片打包下载的需求,借鉴了网上的一些通用方法,就顺便分享出来实现的方法,不太记得借鉴的是哪位兄弟的博客了,总之万分感谢,进入正题,实现打包下载的基本功能:
1.controller层代码:
/** *图片压缩打包 */ @RequestMapping(value="/zipFile") publicvoidcompressionFile(HttpServletRequestrequest,HttpServletResponseresponse,StringbusiId)throwsException{ //业务代码,根据前台传来的ID查询到资源表的图片list SubMetaDatasubMetaData=subMetaDataService.findByBusiId(busiId); if(subMetaData!=null){ Listlist=subMetaDataAttService.findByDataId(subMetaData.getDataId()); if(list.size()>0){ subMetaDataAttService.downloadAllFile(request,response,list); } } }
2.service层通用的文件打包下载
/** *将多个文件进行压缩打包,解决文件名下载后的乱码问题 * */ publicvoiddownloadAllFile(HttpServletRequestrequest,HttpServletResponseresponse,Listlist)throwsUnsupportedEncodingException{ StringdownloadName="附件图片.zip"; StringuserAgent=request.getHeader("User-Agent"); //针对IE或者以IE为内核的浏览器: if(userAgent.contains("MSIE")||userAgent.contains("Trident")){ downloadName=java.net.URLEncoder.encode(downloadName,"UTF-8"); }else{ //非IE浏览器的处理: downloadName=newString(downloadName.getBytes("UTF-8"),"ISO-8859-1"); } //经过上面的名称处理即可解决文件名下载后乱码的问题 response.setContentType("multipart/form-data"); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Disposition",String.format("attachment;filename=\"%s\"",downloadName)); //response.setHeader("Content-Disposition","attachment;fileName="+downloadName); OutputStreamoutputStream=null; ZipOutputStreamzos=null; try{ outputStream=response.getOutputStream(); zos=newZipOutputStream(outputStream); //将文件流写入zip中,此方法在下面贴出 downloadTolocal(zos,list); }catch(IOExceptione){ logger.error("downloadAllFile-下载全部附件失败",e); }finally{ if(zos!=null){ try{ zos.close(); }catch(Exceptione2){ logger.info("关闭输入流时出现错误",e2); } } if(outputStream!=null){ try{ outputStream.close(); }catch(Exceptione2){ logger.info("关闭输入流时出现错误",e2); } } } }
将文件写入zip中的方法:
privatevoiddownloadTolocal(ZipOutputStreamzos,Listlist)throwsIOException{ //获取文件信息//此处为业务代码,可根据自己的需要替换,我在这里是将资源表list循环出取得路径以及文件名,然后放进ZipEntry中再执行下载。 for(SubMetaDataAttsubMetaDataAtt:list){ StringfileId=subMetaDataAtt.getAttId(); StringfileName=subMetaDataAtt.getFileAlias()+subMetaDataAtt.getFileSuffixName(); Stringpath=subMetaDataAtt.getFileAbsolutePath(); InputStreamis=null; BufferedInputStreamin=null; byte[]buffer=newbyte[1024]; intlen; //创建zip实体(一个文件对应一个ZipEntry) ZipEntryentry=newZipEntry(fileName); try{ //获取需要下载的文件流 Filefile=newFile(path); if(file.exists()){ is=newFileInputStream(file); } in=newBufferedInputStream(is); zos.putNextEntry(entry); //文件流循环写入ZipOutputStream while((len=in.read(buffer))!=-1){ zos.write(buffer,0,len); } }catch(Exceptione){ logger.info("下载全部附件--压缩文件出错",e); }finally{ if(entry!=null){ try{ zos.closeEntry(); }catch(Exceptione2){ logger.info("下载全部附件--zip实体关闭失败",e2); } } if(in!=null){ try{ in.close(); }catch(Exceptione2){ logger.info("下载全部附件--文件输入流关闭失败",e2); } } if(is!=null){ try{ is.close(); }catch(Exceptione){ logger.info("下载全部附件--输入缓冲流关闭失败",e); } } } }
3.前台js的请求方法:
注:文件的下载不要使用AJAX请求的方法,这样是无法响应请求的,一般会采用Window.open的方法。
window.open(context+"/sub/submetadataatt/zipFile?busiId="+downloadId);//这里的downloadId是我需要传到后台的变量。
总结:关于上传,下载的操作,实际上是要对于java的IO十分熟悉,才可以玩的转,大家一定要把握好基础才可以在项目中游刃有余,不像我需要去借鉴他人的东西,大家一起努力,加油!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。