java 多文件 压缩文件上传处理

java 多文件 压缩文件上传处理

文章主要解决的有 压缩文件.zip .rar 的处理 和 .csv的处理
文章有多处 注释 均为博主按照自己公司的需求处理文件 所以注释掉大家也可以参照
环境为SpringMVC 主要为 后台处理 前台请百度

1.首先最基本的上传到后台 前台可以用 ajaxfileupload.js 处理 多文件上传

/**
	 * **文件上传前台发请求到这里
	 * @param files
	 * @param request
	 * @return
	 */
	@RequestMapping("uploadfile")
	@ResponseBody
	public void upload(@RequestParam("file") MultipartFile[] files, HttpServletRequest request){
		
		//判断文件大小   可以自行选择要或者不要
		if(files!=null){
			long sumSize = 32505856;
			for(MultipartFile file:files){
				if (file.getSize() == 0) {
					result.setBool(false);
					result.setInfo("文件无内容,请检查");
					return result;
				}
				sumSize -= file.getSize();
			} 
			if(sumSize<=0){
				result.setBool(false);
				result.setInfo("超过文件上传上限31M!");
				return result;
			}
		}
		if(StringUtils.isNotEmpty(json)){
			json=json.replaceAll("\\\\", "\\\\\\\\");
		}
		
		//这里可根据需求自己更改 如 "/files/path/data/upload" 主要用于存住文件
		String uploadURI = "/files/path/data/upload";//上传文件及解压文件目录
		//批量上传文件的路径的结果集合
		List<List<String>> allFilePaths = null;
		try {
			//这里的upload方法在下面
			allFilePaths = upload(files,uploadURI );//所有文件路径集合
		} catch (Exception e1) {
			e1.printStackTrace();
			/*result.setBool(false);错误处理
			result.setInfo("文件上传失败!");
			return result;*/
		}
		//判断上传的文件后缀是否符合规则
		if(allFilePaths.get(0).size()==0&&allFilePaths.get(1).size()==0){
			result.setBool(false);
			result.setInfo("请上传规定后缀名的文件!");
		}
		//这里的方法也在下面 用于处理压缩文件和普通文件 
		OflFileBean.upOflFile(allFilePaths);
		return void;
	}



/**	upload 工具方法
	 * 批量上传文件,并返回压缩文件路径和普通文件路径集合
	 * @param files 文件集合
	 * @param uploadDir 上传文件存放目录
	 * @return list 0-压缩文件路径集合,1-普通文件路径集合
	 */
	private List<List<String>> upload(MultipartFile[] files,String uploadDir) throws Exception{
		long before = System.currentTimeMillis();
		List<List<String>> list = new ArrayList<List<String>>();
		List<String> zipFilePaths = new ArrayList<String>();//压缩文件路径集合
		List<String> comFilePaths = new ArrayList<String>();//普通文件路径集合
		FileUtil.createDir(uploadDir); //创建文件目录
		//循环上传文件
		for(MultipartFile file:files){
			 String name = file.getOriginalFilename();//文件名称
			 String filePath = uploadDir+"/"+name;
			 //判断是否压缩文件
			 if(name.toLowerCase().endsWith(".zip")||name.toLowerCase().endsWith(".rar")){//压缩文件:以 .zip为后缀
				 zipFilePaths.add(filePath);
			 }
			 if(name.toLowerCase().endsWith(".dat")||name.toLowerCase().endsWith(".txt")||name.toLowerCase().endsWith(".csv") || name.toLowerCase().endsWith(".xls") || name.toLowerCase().endsWith(".dz")){//普通文件,以.txt,.csv为后缀
				 comFilePaths.add(filePath);
			 }
			 File targetFile = new File(filePath);
			 try {
			 	 //这里需要org.apache.commons.io;
				 FileUtils.copyInputStreamToFile(file.getInputStream(),targetFile);
			 } catch (Exception e) {
				 e.printStackTrace();
			 }
		 }
		 list.add(zipFilePaths);
		 list.add(comFilePaths);
		 long after = System.currentTimeMillis();
		 Log.info("文件上传时间:"+(after-before)+"ms");
		 return list;
	}



/*************************************************************************************/
@Service
public class OflFileBean {//文件处理类
	
	private static Pattern p = Pattern.compile("\t|\r|\n");

	public void upOflFile(List<List<String>> allFilePaths) {
		//根据需求自行更改 如:"/files/path/data/upload"
		String uploadURI = "/files/path/data/upload";// 上传文件及解压文件目录
		List<String> zipFilePaths = allFilePaths.get(0);// 上传的压缩文件路径集合
		List<String> upFilePaths = allFilePaths.get(1);// 上传的普通文件路径集合
		upFileData(upFilePaths);//普通文件处理
		zipFileData(zipFilePaths, uploadURI );//压缩文件处理
	}

	
	// 处理普通文件
	private void upFileData(List<String> upFilePaths) {
		for (String stringPath : upFilePaths) {// 文件路径
			try {
				//stringPath 就是文件路径可以对文件进行处理了
				List<String[]> fileInfo = getFileInfo(stringPath);// 读取文件
				//确定结果
				if (fileInfo != null && fileInfo.size() > 0) {
					//处理获取的结果  这里可以参考
					/*
					Map<String, Object> mapdata = new HashMap<String, Object>();
					mapdata.put("data", fileInfo);
					mapdata.put("fileId", fileId);
					byte[] parm = SerializeUtil.gZip(SerializeUtil.serialize(mapdata));
					String isoString = null;
					try {
						isoString = new String(parm, "ISO-8859-1");
					} catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
					RedisUtil.redis_base.lpush("OFFLINEINFO_DATA", isoString, null, true);
					*/
				} else {
					/*失败的参考
					Map<String, Object> map = new HashMap<String, Object>();
					map.put("code", oflFile.getCode());
					map.put("status", "解析失败");
					map.put("errorMsg", "未获取文件数据");
					oflFileMapper.updateStatus(map);
					*/
				}
			} catch (Exception e) {
				e.printStackTrace();
				/*失败的参考
				Map<String, Object> map = new HashMap<String, Object>();
				map.put("code", oflFile.getCode());
				map.put("status", "解析失败");
				map.put("errorMsg", e.getMessage());
				oflFileMapper.updateStatus(map);
				*/
			}
		}
	}
	
	//处理压缩文件
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void zipFileData(List<String> zipFilePaths, String uploadURI) {
		createDir(uploadURI);// 创建解压缩文件路径
		// 解压缩文件,并将解压后文件路径放入集合中
		List listData = null;
		for (String zipFilePath : zipFilePaths) {
			listData = new ArrayList();
			String[] zipPath = zipFilePath.split("/");// 压缩包文件路径按分割符分割
			String zipName = zipPath[zipPath.length - 1];// 压缩包名称
			ZipFile zipFile = null;
			Archive rarFile = null;
			
			// zip文件处理
			if (zipName.toLowerCase().endsWith(".zip")) {
				try {
					zipFile = new ZipFile(zipFilePath, "UTF-8");//编码
					Enumeration<ZipEntry> entryEnum = zipFile.getEntries();
					if (entryEnum != null) {
						// 解压缩文件
						while (entryEnum.hasMoreElements()) {
							ZipEntry zipEntry = (ZipEntry) entryEnum.nextElement();
							// 不是目录且文件大小大于0
							if (zipEntry != null && !zipEntry.isDirectory() && zipEntry.getSize() > 0) {
								
								// 文件路径集合
								String[] originalPath = zipEntry.getName().split("/");
								// 文件名称
								String originalName = originalPath[originalPath.length - 1];
								//获取文件路径
								int indexOf = originalName.indexOf(".");
								String typeName = originalName.substring(indexOf,originalName.length());
								String targetFile = uploadDir + "/" + UUID.randomUUID().toString() + typeName;
								
								// 写入文件 方法再类下面
								writeZipEntry(targetFile, zipFile, zipEntry);
								// 满足.csv 格式文件放入集合中
 								if (originalName.toLowerCase().endsWith(".csv")){
									try {
										// 处理文件 参考
										//List<String[]> fileInfo = getFileInfo(targetFile);
										//放入集合统一处理
										listData.addAll(fileInfo);
									} catch (Exception e) {
										e.printStackTrace();
										//处理错误参考
										/*Log.error(e.getMessage(), e);
										Map<String, Object> map = new HashMap<String, Object>();
										map.put("code", oflFile.getCode());
										map.put("status", "解析失败");
										map.put("errorMsg", e.getMessage());
										oflFileMapper.updateStatus(map);*/
									}
								}
								// 移除文件
								FileUtil.removeFile(targetFile);
							}
						}//while
					}
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					if (zipFile != null) {
						zipFile = null;
					}
				}
			} else if (zipName.toLowerCase().endsWith(".rar")) {// rar文件处理
				try {
					rarFile = new Archive(new File(zipFilePath));
					if (rarFile != null) {
						FileHeader fh = rarFile.nextFileHeader();
						while (fh != null && !fh.isDirectory()) {
							
							String originalName = "";
							if (fh.isUnicode()) {// Unicode文件名使用getFileNameW
								originalName = fh.getFileNameW().trim();
							} else {
								originalName = fh.getFileNameString().trim();
							}
							
							int typeIndex = originalName.indexOf(".");
							String typeName = originalName.substring(typeIndex, originalName.length());
							originalName = UUID.randomUUID().toString() + typeName;
							
							if (fh.isDirectory()) { // 是文件夹
								File fol = new File(uploadDir + File.separator + originalName);
								fol.mkdirs();
							} else { // 是文件
								File out = new File(uploadDir + File.separator + originalName);
								try {
									if (!out.exists()) {
										// 相对路径可能多级,可能需要创建父目录.
										if (!out.getParentFile().exists()) {
											out.getParentFile().mkdirs();
										}
										out.createNewFile();
									}
									FileOutputStream os = new FileOutputStream(out);
									rarFile.extractFile(fh, os);
									os.close();
								} catch (Exception ex) {
									ex.printStackTrace();
								}
							}
							fh = rarFile.nextFileHeader();
							String targetFile = uploadDir + "/" + originalName;
							// 满足 .csv 格式文件解析放入集合中
							if (originalName.toLowerCase().endsWith(".csv")) {
								try {
									// 参考处理文件
									//List<String[]> fileInfo = getFileInfo(targetFile);
									//放入集合统一处理
									listData.addAll(fileInfo);
								} catch (Exception e) {
									e.printStackTrace();
									//错误处理参考
									/*Log.error(e.getMessage(), e);
									Map<String, Object> map = new HashMap<String, Object>();
									map.put("code", oflFile.getCode());
									map.put("status", "解析失败");
									map.put("errorMsg", e.getMessage());
									oflFileMapper.updateStatus(map);*/
								}
							}
							// 移除文件
							FileUtil.removeFile(targetFile);
						}
						rarFile.close();
					}
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					if (zipFile != null) {
						zipFile = null;
					}
				}
			}
			//统一处理解压后的文件
			try {
				//解压的所有文件内容集合处理
				if (listData != null && listData.size() > 0) {
				//解析成功处理
				/*
					String fileId = oflFile.getCode();
					Map<String, Object> mapdata = new HashMap<String, Object>();
					mapdata.put("sn", sn);
					mapdata.put("data", listData);
					mapdata.put("fileId", fileId);
					byte[] parm = SerializeUtil.gZip(SerializeUtil.serialize(mapdata));
					String isoString = new String(parm, "ISO-8859-1");
					RedisUtil.redis_base.lpush("OFFLINEINFO_DATA", isoString, null, true);*/
				} else {
				//白处理
				/*
					Map<String, Object> map = new HashMap<String, Object>();
					map.put("code", oflFile.getCode());
					map.put("status", "解析失败");
					map.put("errorMsg", "未获取文件数据");
					oflFileMapper.updateStatus(map);*/
				}
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
	}

	

	/**
	 * 文件写入本地文件中
	 * @param targetFile
	 * @param zipFile
	 * @param zipEntry
	 */
	private void writeZipEntry(String targetFile, ZipFile zipFile, ZipEntry zipEntry) {
		OutputStream os = null;
		InputStream is = null;
		try {
			os = new BufferedOutputStream(new FileOutputStream(targetFile));
			is = zipFile.getInputStream(zipEntry);
			byte[] buffer = new byte[4096];
			int readlen = 0;
			while ((readlen = is.read(buffer, 0, 4096)) >= 0) {
				os.write(buffer, 0, readlen);
			}
			os.flush();
			os.close();
			is.close();
		} catch (ZipException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 解析 csv 
	public static List<String[]> getFileInfo(String oldFilePath) {
		//读取文件
		String sourcest = FileUtil.read(oldFilePath);
		Scanner scan = new Scanner(sourcest);
		Matcher m = null;
		List<String[]> list = new ArrayList<String[]>();
		String[] cells = null;
		while (scan.hasNextLine()) {
			try {
				String line = scan.nextLine().trim();
				m = p.matcher(line);
				line = m.replaceAll("");
				String[] array = line.split(",");
				cells = new String[array.length];
				for (int i = 0; i < array.length; i++) {
					cells[i] = array[i];
				}
				list.add(cells);
			} catch (Exception e) {
				Log.error(e.getMessage(), e);
			}
		}
		scan.close();
		return list;
	}
	/**
	 * 文件目录不存在,则创建
	 * @author lxf
	 * @param dir
	 */
	public void createDir(String dir){
		File fileDir = new File(dir);
		if(!fileDir.exists()){
			fileDir.mkdirs();
		}
	}

}


以上就是 本文 对 .zip .rar 和 .csv的处理
因为是第一次做 所以可能会有些错误 希望指出 勿喷 谢谢!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值