|
@@ -0,0 +1,113 @@
|
|
|
+package com.gyee.frame.common.file;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.*;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.util.List;
|
|
|
+import java.util.zip.ZipEntry;
|
|
|
+import java.util.zip.ZipOutputStream;
|
|
|
+
|
|
|
+public class FileZip {
|
|
|
+ /**
|
|
|
+ * 加载文件
|
|
|
+ *
|
|
|
+ * @param fileName
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static void download(String fileName, HttpServletResponse response) {
|
|
|
+ FileInputStream fis = null;
|
|
|
+ BufferedInputStream bis = null;
|
|
|
+ try {
|
|
|
+ // 获取文件
|
|
|
+ File file = new File(fileName);
|
|
|
+ // 清空缓冲区,状态码和响应头(headers)
|
|
|
+ response.reset();
|
|
|
+ // 设置ContentType,响应内容为二进制数据流,编码为utf-8,此处设定的编码是文件内容的编码
|
|
|
+ response.setContentType("application/octet-stream;charset=utf-8");
|
|
|
+ // 以(Content-Disposition: attachment; filename="filename.jpg")格式设定默认文件名,设定utf编码,此处的编码是文件名的编码,使能正确显示中文文件名
|
|
|
+ response.setHeader("Content-Disposition", "attachment;fileName=" + file.getName() + ";filename*=utf-8''" + URLEncoder.encode(file.getName(), "utf-8"));
|
|
|
+
|
|
|
+ // 实现文件下载
|
|
|
+ byte[] buffer = new byte[1024];
|
|
|
+ fis = new FileInputStream(file);
|
|
|
+ bis = new BufferedInputStream(fis);
|
|
|
+ // 获取字节流
|
|
|
+ OutputStream os = response.getOutputStream();
|
|
|
+ int i = bis.read(buffer);
|
|
|
+ while (i != -1) {
|
|
|
+ os.write(buffer, 0, i);
|
|
|
+ i = bis.read(buffer);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ if (bis != null) {
|
|
|
+ try {
|
|
|
+ bis.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (fis != null) {
|
|
|
+ try {
|
|
|
+ fis.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @describe 压缩多个文件
|
|
|
+ * @author zfc
|
|
|
+ */
|
|
|
+ public static String zipFiles(List<File> srcFiles, File zipFile) {
|
|
|
+ // 判断压缩后的文件存在不,不存在则创建
|
|
|
+ if (!zipFile.exists()) {
|
|
|
+ try {
|
|
|
+ zipFile.createNewFile();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建 FileOutputStream 对象
|
|
|
+ FileOutputStream fileOutputStream = null;
|
|
|
+ // 创建 ZipOutputStream
|
|
|
+ ZipOutputStream zipOutputStream = null;
|
|
|
+ // 创建 FileInputStream 对象
|
|
|
+ FileInputStream fileInputStream = null;
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 实例化 FileOutputStream 对象
|
|
|
+ fileOutputStream = new FileOutputStream(zipFile);
|
|
|
+ // 实例化 ZipOutputStream 对象
|
|
|
+ zipOutputStream = new ZipOutputStream(fileOutputStream);
|
|
|
+ // 创建 ZipEntry 对象
|
|
|
+ ZipEntry zipEntry = null;
|
|
|
+ // 遍历源文件数组
|
|
|
+ for (int i = 0; i < srcFiles.size(); i++) {
|
|
|
+ // 将源文件数组中的当前文件读入 FileInputStream 流中
|
|
|
+ fileInputStream = new FileInputStream(srcFiles.get(i));
|
|
|
+ // 实例化 ZipEntry 对象,源文件数组中的当前文件
|
|
|
+ zipEntry = new ZipEntry(srcFiles.get(i).getName());
|
|
|
+ zipOutputStream.putNextEntry(zipEntry);
|
|
|
+ // 该变量记录每次真正读的字节个数
|
|
|
+ int len;
|
|
|
+ // 定义每次读取的字节数组
|
|
|
+ byte[] buffer = new byte[1024];
|
|
|
+ while ((len = fileInputStream.read(buffer)) > 0) {
|
|
|
+ zipOutputStream.write(buffer, 0, len);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ zipOutputStream.closeEntry();
|
|
|
+ zipOutputStream.close();
|
|
|
+ fileInputStream.close();
|
|
|
+ fileOutputStream.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return zipFile.getAbsolutePath();
|
|
|
+ }
|
|
|
+}
|