2020年10月28日02:41:31-下载多个文件时自动压缩成zip格式

1、前端JS
// 下载附件
downLoadAttachment : function(flag) {
	var me = this;
	var sizeFlag = "";
	var fileID = "";
	var recordID = "";
	if(flag == "0"){// 下载单个附件
		fileID = me.getSelectionModel().getSelection()[0].data.FILEID;
		sizeFlag = "0";
	} else if (flag == "1"){
		recordID = me.RECORDID;
		sizeFlag = "1";
	}
	Ext.DownLoad({
		url: "/jxkh/common/Attachment/downloadAttachment?theme=none",
		params : {
			SIZEFLAG : sizeFlag,// 0-表示下载单个附件 1-表示下载多个附件(*)
			FILEID : fileID,// 下载单个附件时对应fileId(*)
			RECORDID : recordID,// 下载多个附件时对应的主键(*)
			TITLE : me.OBJECTNAME// 压缩包文件名称(*)
		}
	});
}
2、后台java
/**
 * 下载附件
 * @throws Exception
 */
@Action
public void downloadAttachment() {
	HttpServletRequest request = ActionContext.getActionContext().getHttpServletRequest();
	HttpServletResponse response = ActionContext.getActionContext().getHttpServletResponse();
	Map<String, Object> map = new HashMap<String, Object>();
	String resource = System.getProperty("resourceFiles.location");
	String sizeFlag = request.getParameter("SIZEFLAG");// 0-下载单个文件 1-下载多个文件
	String fileId = request.getParameter("FILEID");// 下载单个附件时对应fileId
	String objectID = request.getParameter("RECORDID");// 下载多个附件时对应的主键
	String TITLE = request.getParameter("TITLE");// 压缩包文件名称
	String zipFileName = TITLE + "." + "zip";
	InputStream is = null;
	OutputStream os = null;
	if(sizeFlag.equals("0")){// 下载单个文件
		map.put("FILEID", fileId);
		List<Map<String, Object>> singleFileList = this.bdsoftMybatisUtils.selectList("JXKH.COMMON.SELECT_JXKH_FILE", map);
		String singleFileID = (String) singleFileList.get(0).get("FILEID");
		String downSql = "SELECT RELATIVEFILEPATH,FILENAME FROM JXKH_FILE WHERE FILEID = '" + singleFileID + "'";
		Map<String, Object> downFile = jdbcOperations.queryForMap(downSql);
		String filePath = downFile.get("RELATIVEFILEPATH").toString();
		String fileName = downFile.get("FILENAME").toString();
		String filePathTemplate = resource + "/" + filePath;
		try {
			is = new FileInputStream(new File(filePathTemplate));
			byte[] buffer = new byte[is.available()];
			
			is.read(buffer);
			response.reset();
			response.setContentType("application/octet-stream");
			response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("gbk"), "iso-8859-1"));
		
			os = new BufferedOutputStream(response.getOutputStream());
			os.write(buffer);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				os.flush();
				is.close();
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	} else if (sizeFlag.equals("1")){// 下载多个文件
		map.put("OBJECTID", objectID);
		List<Map<String, Object>> manyFileList = this.bdsoftMybatisUtils.selectList("JXKH.COMMON.JXKH_SELECT_ATTACHMENTLIST", map);
		String tempLocation = resource + File.separator + "jxkh" + File.separator + "temp";
		synchronized (this) {
			File filePar = new File(new String(tempLocation));
			if (!filePar.exists()) {// 如果文件夹不存在
				filePar.mkdir();// 创建文件夹
			} else {
				delFile(filePar);
				filePar.mkdir();// 创建临时文件夹
			}
			for (int i = 0; i < manyFileList.size(); i++) {
				try {
					String manyFileID = (String) manyFileList.get(i).get("FILEID");
					String downSql = "SELECT RELATIVEFILEPATH,FILENAME FROM JXKH_FILE WHERE FILEID = '" + manyFileID + "'";
					Map<String, Object> downFile = jdbcOperations.queryForMap(downSql);
					String filePath = downFile.get("RELATIVEFILEPATH").toString();
					String fileName = downFile.get("FILENAME").toString();
					String resourceFile = resource + "/" + filePath;
					File file = new File(new String(tempLocation + File.separator + fileName));
					if (file.exists()) {
						file.delete();
					} else {
						file.createNewFile();
					}
					is = new BufferedInputStream(new FileInputStream(resourceFile));
					os = new FileOutputStream(file, true);// 输出流
					byte[] buffer = new byte[is.available()];
					while ((is.read(buffer)) != -1) {// 读取到末尾 返回-1 否则返回读取的字节个数
						os.write(buffer);
					}
					os.flush();
					is.close();
					os.close();
				} catch (Exception e) {
					continue;
				}
			}
			ZipParameters zp = new ZipParameters();
			zp.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
			zp.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
			String uuid = UUID.randomUUID().toString();
			
			try {
				ZipFile zipFile = new ZipFile(tempLocation + File.separator + uuid);
				zipFile.addFolder(filePar, zp);
				
				response.reset();
				response.setContentType("application/octet-stream");
				response.addHeader("Content-Disposition", "attachment;filename=" + new String(zipFileName.getBytes("GBK"), "iso-8859-1"));
				os = new BufferedOutputStream(response.getOutputStream());
				is = new BufferedInputStream(new FileInputStream(ParamValidateUtil.validateFilePath(tempLocation + File.separator + uuid)));
				byte[] buffer = new byte[is.available()];
				while ((is.read(buffer)) != -1) {// 读取到末尾 返回-1 否则返回读取的字节个数
					os.write(buffer);
				}
				os.flush();
				is.close();
				os.close();
				// 删除临时文件
				delFile(filePar);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

/**
 * 删除附件
 * @return
 * @throws Exception
 */
@Action
public String deleteAttachment() throws Exception {
	HttpServletRequest request = ActionContext.getActionContext().getHttpServletRequest();
	Map<String, Object> map = new HashMap<String, Object>();
	String FILEID = request.getParameter("FILEID");
	map.put("FILEID", FILEID);
	try {
		List<Map<String, Object>> list = this.bdsoftMybatisUtils.selectList("JXKH.COMMON.SELECT_JXKH_FILE", map);
		if (list != null && list.size() > 0) {
			if(list.get(0) != null){
				String filePath = list.get(0).get("ABSOLUTEFILEPATH").toString();
				File file = new File(filePath);
				if (file.exists()) {
					file.delete();
				}
			}
		}
		this.bdsoftMybatisUtils.delete("JXKH.COMMON.DELETE_JXKH_FILE", map);
		this.bdsoftMybatisUtils.delete("JXKH.COMMON.DELETE_JXKH_KHCL", map);
	} catch (Exception e) {
		return "{success:false,message:'操作失败'}";
	}
	return "{success:true}";
}

/**
 * 删除临时文件
 * @param file
 * @return
 */
private boolean delFile(File file) {
	if (!file.exists()) {
		return false;
	}
	if (file.isDirectory()) {
		File[] files = file.listFiles();
		for (File f : files) {
			delFile(f);
		}
	}
	return file.delete();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值