文件从数据库存入磁盘,并打包成zip文件

一、背景

由于最近工作时候实现一个文件打包下载,文件数量比较多,自研架构支持不了一次直接从数据查询出导出的文件结果。因次通过分批次进行从数据库查出文件写入磁盘,再从磁盘中生成zip文件,返回给前端。

二、数据库文件入磁盘

	/**
	 * 将数据库中的文件写入到磁盘中
	 * 
	 * @param bytes  
	 * @param filePath  文件临时文件夹
	 * @param fileName	文件名称
	 */
	public void addFileToFolder(byte[] bytes, String filePath, String fileName) {
		BufferedOutputStream bos = null;
		FileOutputStream fos = null;
		File file = null;
		try {
			File dir = new File(filePath);
			if (!dir.exists() && !dir.isDirectory()) {
				dir.mkdirs();
			}
			// 由于Linux下中文展示会有问题,建议将文件名转码
			fileName = URLEncoder.encode(fileName, "utf-8");
			file = new File(filePath + File.separator + fileName);
			fos = new FileOutputStream(file);
			bos = new BufferedOutputStream(fos);
			bos.write(bytes);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}

三、从磁盘读取文件生成ZIP文件

/**
	 * 	将临时文件夹中的文件生成ZIP文件
	 * @param filePath		文件存放位置和压缩文件存放位置	
	 * @param fileName	zip文件名称
	 */
	public void fileToZip(String filePath, String zipName) {
		File sourceFile = new File(filePath);
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		ZipOutputStream zos = null;
		try {
			File zipFile = new File(filePath + File.separator + zipName);
			File[] files = sourceFile.listFiles();
			if (null == files || files.length < 1) {
				System.out.println("目录:" + filePath + "里面不存在文件,无需压缩.");
			} else {
				FileOutputStream fos = new FileOutputStream(zipFile);
				zos = new ZipOutputStream(new BufferedOutputStream(fos));
				byte[] bufs = new byte[1024 * 10];
				for (int i = 0; i < files.length; i++) {
					ZipEntry zipEntry = new ZipEntry(URLDecoder.decode(files[i].getName()));
					zos.putNextEntry(zipEntry);
					fis = new FileInputStream(files[i]);
					bis = new BufferedInputStream(fis, 1024 * 10);
					int read = 0;
					while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
						zos.write(bufs, 0, read);
					}
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			if (bis != null) {
				try {
					bis.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (zos != null) {
				try {
					zos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}

四、通过springboot+mybatisPlus去实现zip压缩的话,不需要这些,直接可以查询出所有文件,去生成zip文件,返回流给前端即可。

五、目前这种方式也受限于我们所用的自研框架,另一种思路是通过事件去处理,每次insert文件之后,通过事件直接将文件写入磁盘,再打包。

 

你可能感兴趣的:(框架)