java压缩包加密上传,解密下载

业务场景

供应商上传投标文件需要进行加密处理,通过链接下载时下载的时加密的文件,而通过系统内访问接口下载时,下载的是解密好的文件。

问题解决思路

1. 首先配置三个保存文件的地址:上传地址,解密地址,再次加密地址(也就是最终地址)

2. 压缩包加密上传思路:上传压缩文件时,首先上传到上传地址进行解压,解压完成后,删除掉上传地址的压缩文件,生成密码保存数据库再次加密压缩到加密地址,并删除掉解压的文件。

3. 压缩包解密下载思路:通过系统外部链接下载时下载的是已经加密好的文件。而通过内部接口下载走解密接口,通过传入的信息,匹配数据库中响应的密码。进行解密并并再次进行无密码压缩。最终返回给用户解密后的压缩文件。

4. 使用工具:zip4j

核心方法

1. 引入依赖

        <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version></dependency>

2. 配置文件上传路径(在yml中配置并在需要使用的类中引入)

    /*文件上传路径*/@Value(value = "${jeecg.path.upload}")private String uploadpath;/*压缩包解压路径*/@Value(value = "${jeecg.path.zipUpFile}")private String zipUpFile;/*压缩包上传路径*/@Value(value = "${jeecg.path.zipFilePath}")private String zipFilePath;

3. 加密压缩方法(封装到工具类中)

    /*** 加密压缩*/public void zipFolderToZip(String extractPath, String filePath, String password) throws Exception {try {log.debug("将" + extractPath + "目录下的文件打包并加密");String path = filePath.substring(0,filePath.lastIndexOf("/"));File destFile = new File(path);//压缩目录System.out.println(destFile.isDirectory());System.out.println(destFile.exists());destFile.mkdirs();if (!destFile.isDirectory() && !destFile.exists()) {destFile.mkdirs();}ZipFile zipFile = new ZipFile(filePath);ZipParameters parameters = new ZipParameters();parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);if(password != null){//是否加密parameters.setEncryptFiles(true);//使用标准加密方式parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);//设置加密密钥parameters.setPassword(password);}parameters.setIncludeRootFolder(false);zipFile.addFolder(extractPath, parameters);log.debug("将" + extractPath + "目录下的文件打包并加密 成功");} catch (ZipException e) {throw new Exception(e.getMessage());}}

4. 解密方法(封装到工具类中)

    /*** 解压*/public void upzip(File zipFile, String dest, String password) throws Exception {try {ZipFile zFile = new ZipFile(zipFile);//指向压缩文件.zip//设置文件名编码,在gbk系统中需要设置,文件名称是中文就不会乱码
//            zFile.setFileNameCharset("GBK");if (!zFile.isValidZipFile()) {// 检查文件是否合法throw new Exception("文件名不合法");}File destFile = new File(dest);//解压目录if (destFile.isDirectory() && !destFile.exists()) {destFile.mkdirs();}if (zFile.isEncrypted()) {//如果设置了密码zFile.setPassword(password.toCharArray());}zFile.extractAll(dest);//将文件输出到目标目录} catch (Exception e) {throw new Exception(e.getMessage());}}

2. 加密上传

 ZipEncryptUtil zipEncryptUtil = new ZipEncryptUtil();File file = new File(ctxPath+File.separator+dbpath);String upPath = zipUpFile+"/"+dbpath;//将文件解压到该路径下zipEncryptUtil.upzip(file,upPath,null);//将文件打包到该路径String filePath = uploadpath+"/"+dbpath;zipEncryptUtil.zipFolderToZip(upPath,filePath,password);//删除上传的压缩文件zipEncryptUtil.deleteAnyone(ctxPath+"/"+dbpath);//删除解压后的文件zipEncryptUtil.deleteAnyone(upPath);

3. 解密下载

           //获取解压文件路径String filePath = uploadpath + File.separator + imgPath;String downloadFilePath = uploadpath + File.separator + filePath;//将文件解压到指定路径File upFile = new File(filePath);String upPath = zipUpFile+"/"+imgPath;zipEncryptUtil.upzip(upFile,upPath,businessBidDoc.getFilePassword());//将文件压缩不加密压缩到指定路径String finalPath = zipFilePath+"/"+imgPath;zipEncryptUtil.zipFolderToZip(upPath,finalPath,null);File file = new File(downloadFilePath);response.setContentType("application/force-download");// 设置强制下载不打开response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"),"iso-8859-1"));inputStream = new BufferedInputStream(new FileInputStream(finalPath));outputStream = response.getOutputStream();byte[] buf = new byte[1024];int len;while ((len = inputStream.read(buf)) > 0) {outputStream.write(buf, 0, len);}response.flushBuffer();//删除解压的压缩文件zipEncryptUtil.deleteAnyone(upPath);//删除解压后重新压缩的文件zipEncryptUtil.deleteAnyone(finalPath);

java压缩包加密上传,解密下载相关推荐

  1. java web 文件上传和下载

     在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直 ...

  2. java 文件下载 jsp文件_jsp文件 Java实现文件上传与下载

    通过前台选择文件,然后将资源上传到(即新建一个文件)到发布的资源文件下面, 下载就是url 到发布的资源文件,触发即可自动下载.服务器已经封装了如何下载的底层实现.(此处用的是tomcat) JSP上 ...

  3. 【Java】文件上传及下载、限制文件大小

    1.后端部分 Controller代码 // 上传@PostMapping("upload")@ResponseBodypublic Result upload(Multipart ...

  4. java http 下载文件_JAVA通过HttpURLConnection 上传和下载文件的方法

    本文介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,分享给大家,具体如下: HttpURLConnection文件上传 HttpURLConnection采用模拟浏览器上传 ...

  5. java图片预览上传_java实现文件上传、下载、图片预览

    这篇文章主要介绍了java实现文件上传.下载.图片预览,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 多文件保存到本地: @ResponseBody ...

  6. java struts2下载文件_Struts2下多文件的上传与下载

    Struts2下多文件的上传与下载 目录 多文件 上传 下载 随意文件java Struts2单例 配置 动态读取 李顺利 在网络上,对于Java处理文件上传和下载的技术比较多,而Struts作为一款 ...

  7. java 图片分段上传_java文件分片上传,断点续传

    文件夹数据库处理逻辑 publicclassDbFolder { JSONObject root; publicDbFolder() { this.root =newJSONObject(); thi ...

  8. H5+JAVA的文件上传,断点续传

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

  9. ASP.NET文件的上传和下载

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...

最新文章

  1. JS 正则表达式 0.001 ~99.999
  2. redis在PHP中的基本使用案例
  3. Openstack组件部署 — Overview和前期环境准备
  4. AJAX相关JS代码片段和部分浏览器模型
  5. Java BIO、NIO、AIO的区别
  6. EMR on ACK 全新发布,助力企业高效构建大数据平台
  7. c++高斯投影正反算_为何买手机要选Type-C接口的?除充电快以外,还隐藏这4个妙用...
  8. python怎么导包_如何从python中的包导入所有函数?
  9. NodeJs学习笔记001--npm换源
  10. javascript ES3小测试
  11. js数组去重(for循环去遍历源数组)
  12. Magnific Popup – 免费的响应式 jQuery Lightbox 插件
  13. 西北工业大学电工学mooc第六章测试题及解析
  14. 使用Web3j(JAVA)开发ETH钱包-1
  15. 概率论与数理统计(3)--指数分布函数及其期望、方差
  16. vue中使用第三方阿里巴巴矢量图标库,并修改图标大小
  17. mysql 数据透视_把数据库中的数据制作成Excel数据透视表
  18. The Evils of Unity Builds
  19. SSL证书、 der、 cer、 pem区别
  20. 从四个数字中选出三个,一共有多少组合?不重复的

热门文章

  1. PCB电路板特性检查项目都有哪些?
  2. COMMAND NOT FOUND 的两种解决方案
  3. 多元线性回归结果怎么看?
  4. mysql中数据如何备份_mysql数据库如何进行备份和恢复
  5. 浙江邦盛科技-面试总结(offer)
  6. 传智黑马Python人工智能15期视频课程
  7. oracle创建导入数据库,unix下手动创建oracle以及imp数据导入
  8. PostgreSQL数据库实战培训课程(2天速成版)
  9. cocos creator2.4.4 英文卡牌游戏源码H5+安卓+IOS三端源码
  10. 微信新玩法,只需三步就可以在朋友圈发送竖排文字,好看又酷炫!