1.前台页面通过ajax将所选属性,以json格式传递到后台 例如: var obje={ attribute1:value, attribute2:value, ... } $.ajax({ type: "post", url: "后台处理数据地址/functionName", data:obje, dataType : "json", async:true, success: function(data){ }, error:function(e) {} }); 其中 obje中的属性,最好和后台接收实体中一一对应,方便处理(直接get就可获取),否则就要使用@RequestParam(required= false)String attribute1来接收参数 2.后台处理数据 @RequestMapping(value = {"functionName"}) @ResponseBody public String functionName(ShiTiName shiTiName, Model model,@RequestParam(required= false)String attribute1, @RequestParam(required= false)String attribute2) {//attribute1、attribute2不包含实体属性中 //生成的附件保存地址attachmentPath String attachmentPath = getFileAttachmentPath(); String fileName="附件"+DateUtils.getDate("yyyyMMddHHmmss"); attachmentPath =attachmentPath+fileName; String tag="0";//默认成功 //获取服务器端文件存储的根路径 String paths=getUploadPath(); try { //根据前端传递参数,获取符合条件的所有数据 List<ShiTiName> list = shiTiNameService.getPersonInfoList(shiTiName); for (int i = 0; i < list.size(); i++) { String path=attachmentPath+"/"+list.get(i).getName()+"/"; File file1 = new File(path); if(!file1.exists()){//如果文件夹不存在则生成 File files = new File(path); files.setWritable(true, false); //linux创建文件路径授权 boolean flg =files.mkdirs(); if(flg){ //System.out.println("成功生成文件夹:"+path); } } //所选属性 split String[] split = shiTiName.getDaoChuXiangStrs().split(","); //将前台所选属性 对应的文件,复制到要压缩的文件夹中 for (int j = 0; j < split.length; j++) { if(split[j].equals("1")) {//第一个所选属性 //paths服务器端文件存储的根路径 //path要压缩的文件夹 //list.get(i).getAttribute1()所选属性对应的文件地址 getCopyPath(paths,path,list.get(i).getAttribute1()); }else if(split[j].equals("2")) {//第二个所选属性 getCopyPath(paths,path,list.get(i).getAttribute2()); }... } } //前台所选属性,对应的文件,都已复制到path对应的文件夹中,然后将文件夹压缩 zipFiles(attachmentPath,"",attachmentPath+".zip"); } catch (IOException e) { e.printStackTrace(); tag=1;//异常失败 //将生成的文件夹删除 File fileDir = new File(attachmentPath); if(fileDir.exists()) { deleteDirectory(attachmentPath); } File file = new File(attachmentPath+".zip"); if(file.isFile()) { delFile(attachmentPath+".zip"); } } finally { //压缩完成,将生成的文件夹删除 File fileDir = new File(attachmentPath); if(fileDir.exists()) { deleteDirectory(attachmentPath); } } return tag; } public String getSysPath() { String path = Thread.currentThread().getContextClassLoader() .getResource("").toString(); String temp = path.replaceFirst("file:/", "").replaceFirst( "WEB-INF/classes/", ""); String separator = System.getProperty("file.separator"); String resultPath = temp.replaceAll("/", separator + separator); return resultPath; } //附件保存路径 public String getFileAttachmentPath() { String finallstsr=SystemPath.getSysPath(); finallstsr = finallstsr.replaceAll("\\", "/"); String proRootPath="/"+finallstsr+"userfiles/attachment/";//Linux路径 String os = System.getProperty("os.name"); if(os.toLowerCase().startsWith("win")){ proRootPath=SystemPath.getSysPath()+"userfiles\attachment\";//Windows路径 } return proRootPath; } //上传下载路径 public String getUploadPath() { String finallstsr=SystemPath.getSysPath(); finallstsr = finallstsr.replaceAll("\\", "/"); String proRootPath="/"+finallstsr+"userfiles";//Linux路径 String os = System.getProperty("os.name"); if(os.toLowerCase().startsWith("win")){ proRootPath=SystemPath.getSysPath()+"\userfiles";//Windows路径 } return proRootPath; } //paths服务器端文件存储的根路径 //path要压缩的文件夹 //filePath所选属性对应的文件地址 private void getCopyPath(String paths,String path,String filePath) throws IOException { if (filePath !=null && !filePath.equals("")) { if(filePath.indexOf(",")>0) { String[] split = filePath.split(","); for (String string : split) { File file=new File(paths+"/"+string); if(file.isFile()) { String fileName = string.split("/")[1].substring(13); File fileCopyPath=new File(path+fileName); FileUtils.copyFile(file,fileCopyPath); } } }else { File file=new File(paths+"/"+filePath); if(file.isFile()) { File fileCopyPath=new File(path+filePath.split("/")[1].substring(13)); FileUtils.copyFile(file,fileCopyPath); } } } } /** * 压缩文件或目录 * @param srcDirName 压缩的根目录 * @param fileName 根目录下的待压缩的文件名或文件夹名,其中*或""表示跟目录下的全部文件 * @param descFileName 目标zip文件 */ public void zipFiles(String srcDirName, String fileName,String descFileName) { // 判断目录是否存在 if (srcDirName == null) { logger.debug("文件压缩失败,目录 " + srcDirName + " 不存在!"); return; } File fileDir = new File(srcDirName); if (!fileDir.exists() || !fileDir.isDirectory()) { logger.debug("文件压缩失败,目录 " + srcDirName + " 不存在!"); return; } String dirPath = fileDir.getAbsolutePath(); File descFile = new File(descFileName); try { ZipOutputStream zouts = new ZipOutputStream(new FileOutputStream(descFile)); zouts.setEncoding("GBK"); if ("*".equals(fileName) || "".equals(fileName)) { FileUtils.zipDirectoryToZipFile(dirPath, fileDir, zouts); } else { File file = new File(fileDir, fileName); if (file.isFile()) { FileUtils.zipFilesToZipFile(dirPath, file, zouts); } else { FileUtils .zipDirectoryToZipFile(dirPath, file, zouts); } } zouts.close(); logger.debug(descFileName + " 文件压缩成功!"); } catch (Exception e) { logger.debug("文件压缩失败:" + e.getMessage()); e.printStackTrace(); } } /** * 将目录压缩到ZIP输出流 * @param dirPath 目录路径 * @param fileDir 文件信息 * @param zouts 输出流 */ public static void zipDirectoryToZipFile(String dirPath, File fileDir, ZipOutputStream zouts) { if (fileDir.isDirectory()) { File[] files = fileDir.listFiles(); // 空的文件夹 if (files.length == 0) { // 目录信息 ZipEntry entry = new ZipEntry(getEntryName(dirPath, fileDir)); //entry.setUnixMode(755); try { zouts.putNextEntry(entry); zouts.closeEntry(); } catch (Exception e) { e.printStackTrace(); } return; } for (int i = 0; i < files.length; i++) { if (files[i].isFile()) { // 如果是文件,则调用文件压缩方法 FileUtils .zipFilesToZipFile(dirPath, files[i], zouts); } else { // 如果是目录,则递归调用 FileUtils.zipDirectoryToZipFile(dirPath, files[i], zouts); } } } } /** * 将文件压缩到ZIP输出流 * @param dirPath 目录路径 * @param file 文件 * @param zouts 输出流 */ public static void zipFilesToZipFile(String dirPath, File file, ZipOutputStream zouts) { FileInputStream fin = null; ZipEntry entry = null; // 创建复制缓冲区 byte[] buf = new byte[4096]; int readByte = 0; if (file.isFile()) { try { // 创建一个文件输入流 fin = new FileInputStream(file); // 创建一个ZipEntry entry = new ZipEntry(getEntryName(dirPath, file)); //entry.setUnixMode(644); // 存储信息到压缩文件 zouts.putNextEntry(entry); // 复制字节到压缩文件 while ((readByte = fin.read(buf)) != -1) { zouts.write(buf, 0, readByte); } zouts.closeEntry(); fin.close(); System.out .println("添加文件 " + file.getAbsolutePath() + " 到zip文件中!"); } catch (Exception e) { e.printStackTrace(); } } } /** * 获取待压缩文件在ZIP文件中entry的名字,即相对于跟目录的相对路径名 * @param dirPat 目录名 * @param file entry文件名 * @return */ private static String getEntryName(String dirPath, File file) { String dirPaths = dirPath; if (!dirPaths.endsWith(File.separator)) { dirPaths = dirPaths + File.separator; } String filePath = file.getAbsolutePath(); // 对于目录,必须在entry名字后面加上"/",表示它将以目录项存储 if (file.isDirectory()) { filePath += "/"; } int index = filePath.indexOf(dirPaths); return filePath.substring(index + dirPaths.length()); } /** * * 删除目录及目录下的文件 * * @param dirName 被删除的目录所在的文件路径 * @return 如果目录删除成功,则返回true,否则返回false */ public static boolean deleteDirectory(String dirName) { String dirNames = dirName; if (!dirNames.endsWith(File.separator)) { dirNames = dirNames + File.separator; } File dirFile = new File(dirNames); if (!dirFile.exists() || !dirFile.isDirectory()) { logger.debug(dirNames + " 目录不存在!"); return true; } boolean flag = true; // 列出全部文件及子目录 File[] files = dirFile.listFiles(); for (int i = 0; i < files.length; i++) { // 删除子文件 if (files[i].isFile()) { flag = deleteFile(files[i].getAbsolutePath()); // 如果删除文件失败,则退出循环 if (!flag) { break; } }else if (files[i].isDirectory()) {// 删除子目录 flag = deleteDirectory(files[i].getAbsolutePath()); // 如果删除子目录失败,则退出循环 if (!flag) { break; } } } if (!flag) { logger.debug("删除目录失败!"); return false; } // 删除当前目录 if (dirFile.delete()) { logger.debug("删除目录 " + dirName + " 成功!"); return true; } else { logger.debug("删除目录 " + dirName + " 失败!"); return false; } } /** * * 删除单个文件 * * @param fileName 被删除的文件名 * @return 如果删除成功,则返回true,否则返回false */ public boolean deleteFile(String fileName) { File file = new File(fileName); if (file.exists() && file.isFile()) { if (file.delete()) { logger.debug("删除文件 " + fileName + " 成功!"); return true; } else { logger.debug("删除文件 " + fileName + " 失败!"); return false; } } else { logger.debug(fileName + " 文件不存在!"); return true; } } /** * * 删除文件,可以删除单个文件或文件夹 * * @param fileName 被删除的文件名 * @return 如果删除成功,则返回true,否是返回false */ public boolean delFile(String fileName) { File file = new File(fileName); if (!file.exists()) { logger.debug(fileName + " 文件不存在!"); return true; } else { if (file.isFile()) { return deleteFile(fileName); } else { return deleteDirectory(fileName); } } }