java web项目如何批量下载文件

java web项目如何批量下载文件背景:根据浏览器的不同,下载文件需要的插件也有所不同,同时在下载个数的也有要求,比如IE浏览器,下载文件的个数如果超过50,则会出现问题。以下介

大家好,欢迎来到IT知识分享网。

背景:根据浏览器的不同,下载文件需要的插件也有所不同,同时在下载个数的也有要求,比如IE浏览器,下载文件的个数如果超过50,则会出现问题。

以下介绍一个不依赖任何插件。跨浏览器的实现是方式。

import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Collection; /** * 批量下载附件。 * @param fileId 附件Id * @param fileName 下载文件的文件名,可选 * @return 附件的数据流 * @throws BusinessException */ @GET @Path("file/batchDownload/{fileIds}") public Response batchDownloadBySecret(@PathParam("fileIds") String fileIds, @QueryParam("zipFileName") String zipFileName) throws BusinessException { String nofileMsg = ResourceUtil.getString("fileupload.document.FileNoFound"); // 解析fileId List<Long> longFileIds = new ArrayList<>(); if (Strings.isNotBlank(fileIds)) { String[] fileIdArray = fileIds.split(","); for (String id : fileIdArray) { longFileIds.add(Long.parseLong(id)); } } // 获取所有文件对象 List<File> fileList = new ArrayList<File>(); for (Long longFileId : longFileIds) { // V3XFile 是各个公司自己的文件PO V3XFile v3xfile = getFileManager().getV3XFile(longFileId); if (v3xfile == null) { //文件数据库中对应的记录已经删除,返回对应的信息 throw new javax.ws.rs.NotFoundException(nofileMsg); } //创建文件 String filename = v3xfile.getFilename(); Date createDate = v3xfile.getCreateDate(); // 获取服务器的临时目录。各个项目取值不一 File tmpDirFile = getFileManager().getFile(v3xfile.getId(), createDate); // 拿到临时目录下的文件 if (tmpDirFile == null) { //物理文件已经删除,返回对应的信息 throw new BusinessException(nofileMsg); } String realFileName = SystemEnvironment.getSystemTempFolder() + File.separator + filename; File realFile = new File(realFileName); // 复制文件到指定目录。各个项目使用的工具类不一, FileUtil.copyFile(tmpDirFile, realFile); fileList.add(realFile); } String name; if (StringUtils.isBlank(zipFileName)) { name = "responseZipFile"; } else { name = zipFileName; } try { name = URLEncoder.encode(name+".zip", "UTF-8"); } catch (UnsupportedEncodingException e) { log.error("batchDownload - url encode file name error ", e); } response.setHeader("Content-Disposition ", "attachment;filename=" + name ); try { zip(fileList,response.getOutputStream()); } catch (IOException e) { log.error("batchDownload - compress zip file error ", e); } for (File f : fileList) { try { f.delete(); } catch (Exception e) { log.error("batchDownload - delete temporary file", e); } } return Response.ok().build(); } private static final String OUTPUT_ENCODING = java.nio.charset.Charset.defaultCharset().toString(); private void zip(Collection<File> files, OutputStream zipOutPutStream) throws IOException, FileNotFoundException { byte[] b = new byte[1024]; ZipOutputStream zipout = null; try { zipout = new ZipOutputStream(zipOutPutStream); zipout.setEncoding(OUTPUT_ENCODING); for (File file : files) { if (!file.exists()) { throw new FileNotFoundException("File not found:" + file.getAbsolutePath()); } String filename = file.getName(); if (file.isFile()) { InputStream in = new FileInputStream(file); try { ZipEntry ze = new ZipEntry(filename); ze.setUnixMode(644);// 解决linux乱码 zipout.putNextEntry(ze); int len = 0; while ((len = in.read(b)) > 0) { zipout.write(b, 0, len); } } finally { in.close(); } } } } catch (FileNotFoundException ex) { throw ex; } catch (IOException ex1) { throw ex1; } finally { if (zipout != null) { try { zipout.close(); } catch (IOException ex) { } } } }

前端调用

// JSP代码如下 <a id="batchDownloadResult" href="#" style="display:none"><span id="batchDownloadResultSpan">download</span></a> // JS调用 function batchDownloadFun(){ $("#batchDownload").bind("click",function(){ if($(".eachSelect:checked").size() == 0){ //$.alert("至少选择一项数据,当前已选择0项"); $.alert("${ctp:i18n('collaboration.summary.label.batchdown')}"); return; }else{ var $obj = $(".eachSelect:checked"); var ids=""; for (var i = 0; i < $obj.size(); i ++) { ids = ids + $obj[i].value; if(i<$obj.size()-1){ ids = ids +","; } } var url = _ctxPath+"/rest/attachment/file/batchDownload/"+ids+"?zipFileName="+Date.now(); $("#batchDownloadResult").attr("href",url); $("#batchDownloadResultSpan").trigger("click"); } }); }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/49661.html

(0)
上一篇 2024-08-30 12:45
下一篇 2024-08-30 18:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信