Java实现批量上传文件(PDF,图片),压缩成.zip压缩包下载

//根据查询条件批量下载文件(PDF)
public String executePDF() throws Exception {

      String sitStateIds = get("sitStateIds");
      String sitTypeIds = get("sitTypeIds");
      Long years = getLong("years");
      String name = get("name");
      String schoolname = get("schoolname");
      Long sbmh = getLong("sbmh");
      Long provinces = getLong("provinces");
      Long sitTypeId = getLong("sitTypeId");
      Long statuId = getLong("statuId");
      Long studentstatusId = getLong("studentstatusId");
      String checkStuSit = get("checkStuSit");
      String identity = get("identity");

      String blsx = get("blsx");
      if(blsx == null){
         blsx = "";
      }
      String qjbl = get(blsx);
      // EntityQuery query = sitTypeInfoService.searchList(years, name,
      // schoolname, sbmh, provinces, sitTypeId, statuId,
      // studentstatusId, checkStuSit, identity);
      EntityQuery query = sitTypeInfoService.searchList2(years, name, schoolname, sbmh, provinces, sitTypeIds, sitStateIds, studentstatusId, checkStuSit, identity, blsx, qjbl);
      String orderByPras = get("orderBy");
      if (StringUtils.isEmpty(orderByPras)) {
         orderByPras = "studentsInfo.id  ";
      } else {
         if (orderByPras.equals("studentsInfo.sbmh asc") || orderByPras.equals("studentsInfo.name asc") || orderByPras.equals("studentsInfo.sexid.gbname asc") || orderByPras.equals("studentsInfo.schoolname asc") || orderByPras.equals("studentsInfo.gkprovinceid.gbname asc") || orderByPras.equals("studentsInfo.studentstatusid.parametername asc")) {
            orderByPras = "studentsInfo.id  desc";
         }
      }
      if (get("Bkwtxjl") == null) {
         query.add(new Condition("studentsInfo.sexid is not null"));
      }
      // 必须要加的 组合查询
      query.addOrder(Order.parse(orderByPras));
      query.setLimit(getPageLimit());
      List<StudentsInfo> stulist = entityService.search(query);


      //for循环遍历学生id
      Long studentid = null;
      String str = "";
      if(stulist != null && stulist.size() != 0){
         for (int i=0;i<stulist.size();i++) {
            if(i!=stulist.size()-1) {
               str+= stulist.get(i).getId()+",";
            } else {
               //拿到循环后的,分隔学生id
               str+= stulist.get(i).getId();
            }
         }

         
      }

      String uuid = "";
      String filepath = "";
      String basePath = "D:\\uploadPDF";

      OutputStream out = null;
      String fileName = null;
     

      //根据遍历拿到的学生id查询文件uuid(每个文件存在一个唯一的uuid),
      List<FileUploadInfo> lists = entityService.searchHQLQuery("from FileUploadInfo f where  f.studentsInfo.id in ("+str+")" );

      File file = new File(basePath);
      if(!file.exists()){
         file.mkdirs();
      }
      file = new File(basePath+"/file");
      if(!file.exists()){
         file.mkdirs();
      }
      file = new File(basePath+"/zip");
      if(!file.exists()){
         file.mkdirs();
      }
      if(lists != null && lists.size() != 0){
            //根据遍历拿到的 lists 集合中的uuid,遍历上传的文件
         for (FileUploadInfo fileUploadInfo:lists) {

            if(fileUploadInfo.getFileInfo() == null){
               continue;
            }

            uuid = fileUploadInfo.getFileInfo().getUuid();
            filepath = fileUploadInfo.getFileInfo().getFilepath();

            File uploadFile = new File(filepath);
            //下载的文件地址
            //fileName = basePath+"/file/"+uploadFile.getName();
            fileName = basePath+"/file/"+fileUploadInfo.getStudentsInfo().getSbmh()+".pdf";


            out = new FileOutputStream(fileName);
            byte[] bytes = this.File2byte(uploadFile);
            out.write(bytes);

            try{
               if(out != null){
                  out.close();
               }
            }catch (Exception e){
               e.printStackTrace();
            }
            
         }
         
      }

      //压缩成.zip后的地址
      String  zipFilePath = basePath+"/zip/"+System.currentTimeMillis()+".zip";
      FileOutputStream fos1 = new FileOutputStream(new File(zipFilePath));
      //压缩成.zip压缩包
      toZip(new File(basePath+"/file"), fos1,true);

      HttpServletResponse response = (HttpServletResponse) ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE);
      OutputStream outNew = response.getOutputStream();
      File zipFile = new File(zipFilePath);

      String zipFileName = zipFile.getName();
      response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(zipFileName != null ? zipFileName : System.currentTimeMillis()+".zip", "utf-8"));
      byte[] zipBytes = File2byte(zipFile);
      outNew.write(zipBytes);


      try{
         if(outNew != null){
            outNew.close();
         }
      }catch (Exception e){
         e.printStackTrace();
      }

      //清空文件夹
      String pdfPath = "D:\\uploadPDF/file";
      deleteDir(pdfPath);
      zipFile.delete();


      return null;
   }

 

 

public byte[] File2byte(File tradeFile){
   byte[] buffer = null;
   try
   {
      FileInputStream fis = new FileInputStream(tradeFile);
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      byte[] b = new byte[1024];
      int n;
      while ((n = fis.read(b)) != -1)
      {
         bos.write(b, 0, n);
      }
      fis.close();
      bos.close();
      buffer = bos.toByteArray();
   }catch (FileNotFoundException e){
      e.printStackTrace();
   }catch (IOException e){
      e.printStackTrace();
   }
   return buffer;
}
private static final int BUFFER_SIZE = 2 * 1024;
/**
 * 压缩成ZIP 方法1
 * @param sourceFile 压缩文件夹路径
 * @param out  压缩文件输出流
 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
 *             false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
 * @throws RuntimeException 压缩失败会抛出运行时异常
 */
public static void toZip(File sourceFile, OutputStream out, boolean KeepDirStructure)
      throws RuntimeException{
   ZipOutputStream zos = null ;
   try {
      zos = new ZipOutputStream(out);
      compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
   } catch (Exception e) {
      throw new RuntimeException("zip error from ZipUtils",e);
   }finally{
      if(zos != null){
         try {
            zos.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
}
/**
 * 压缩成ZIP 方法2
 * @param srcFiles 需要压缩的文件列表
 * @param out      压缩文件输出流
 * @throws RuntimeException 压缩失败会抛出运行时异常
 */
public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {
   long start = System.currentTimeMillis();
   ZipOutputStream zos = null ;
   try {
      zos = new ZipOutputStream(out);
      for (File srcFile : srcFiles) {
         byte[] buf = new byte[BUFFER_SIZE];
         zos.putNextEntry(new ZipEntry(srcFile.getName()));
         int len;
         FileInputStream in = new FileInputStream(srcFile);
         while ((len = in.read(buf)) != -1){
            zos.write(buf, 0, len);
         }
         zos.closeEntry();
         in.close();
      }
      long end = System.currentTimeMillis();
      System.out.println("压缩完成,耗时:" + (end - start) +" ms");
   } catch (Exception e) {
      throw new RuntimeException("zip error from ZipUtils",e);
   }finally{
      if(zos != null){
         try {
            zos.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
}
/**
 * 递归压缩方法
 * @param sourceFile 源文件
 * @param zos    zip输出流
 * @param name    压缩后的名称
 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
 *             false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
 * @throws Exception
 */
private static void compress(File sourceFile, ZipOutputStream zos, String name,
                      boolean KeepDirStructure) throws Exception{
   byte[] buf = new byte[BUFFER_SIZE];
   if(sourceFile.isFile()){
      // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
      zos.putNextEntry(new ZipEntry(name));
      // copy文件到zip输出流中
      int len;
      FileInputStream in = new FileInputStream(sourceFile);
      while ((len = in.read(buf)) != -1){
         zos.write(buf, 0, len);
      }
      // Complete the entry
      zos.closeEntry();
      in.close();
   } else {
      File[] listFiles = sourceFile.listFiles();
      if(listFiles == null || listFiles.length == 0){
         // 需要保留原来的文件结构时,需要对空文件夹进行处理
         if(KeepDirStructure){
            // 空文件夹的处理
            zos.putNextEntry(new ZipEntry(name + "/"));
            // 没有文件,不需要文件的copy
            zos.closeEntry();
         }
      }else {
         for (File file : listFiles) {
            // 判断是否需要保留原来的文件结构
            if (KeepDirStructure) {
               // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
               // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
               compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
            } else {
               compress(file, zos, file.getName(),KeepDirStructure);
            }
         }
      }
   }
}

 

 

//清空文件夹方法
public static boolean deleteDir(String path){
   File file = new File(path);
   if(!file.exists()){//判断是否待删除目录是否存在
      System.err.println("The dir are not exists!");
      return false;
   }

   String[] content = file.list();//取得当前目录下所有文件和文件夹
   for(String name : content){
      File temp = new File(path, name);
      if(temp.isDirectory()){//判断是否是目录
         deleteDir(temp.getAbsolutePath());//递归调用,删除目录里的内容
         temp.delete();//删除空目录
      }else{
         if(!temp.delete()){//直接删除文件
            System.err.println("Failed to delete " + name);
         }
      }
   }
   return true;
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 可以通过使用 ZipOutputStream 类来将多个文件压缩成一个 zip 压缩包,具体实现步骤如下: 1. 创建一个 FileOutputStream 对象,并通过 ZipOutputStream 的构造函数创建一个 ZipOutputStream 对象,将 FileOutputStream 对象作为参数传入。 ```java FileOutputStream fos = new FileOutputStream("test.zip"); ZipOutputStream zos = new ZipOutputStream(fos); ``` 2. 创建一个 File 对象数组,表示要被压缩文件列表。 ```java File[] files = new File[] { new File("file1.txt"), new File("file2.txt"), new File("file3.txt") }; ``` 3. 遍历文件列表,将每个文件逐个添加到 zip 压缩包中。 ```java for (File file : files) { FileInputStream fis = new FileInputStream(file); ZipEntry ze = new ZipEntry(file.getName()); zos.putNextEntry(ze); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zos.write(buffer, 0, len); } zos.closeEntry(); fis.close(); } ``` 4. 关闭 ZipOutputStream 和 FileOutputStream 对象。 ```java zos.close(); fos.close(); ``` 完整代码示例: ```java import java.io.*; import java.util.zip.*; public class ZipFiles { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("test.zip"); ZipOutputStream zos = new ZipOutputStream(fos); File[] files = new File[] { new File("file1.txt"), new File("file2.txt"), new File("file3.txt") }; for (File file : files) { FileInputStream fis = new FileInputStream(file); ZipEntry ze = new ZipEntry(file.getName()); zos.putNextEntry(ze); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zos.write(buffer, 0, len); } zos.closeEntry(); fis.close(); } zos.close(); fos.close(); } } ``` 运行以上代码,就可以将 file1.txt、file2.txt 和 file3.txt 三个文件压缩成一个 test.zip 压缩包

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值