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();
}