文件加密解密工具类
:需求:文件上传到系统后,只能通过系统预览或者下载,其他方式下载下来的文件,对方看不了,
实现思路:上传文件时,对文件进行加密处理,数据库存放文件名,把加密文件存到指定目录下
预览、下载文件时,通过指定目录+文件名,找到该文件,并进行解密处理,根据前端需求,对解密后的文件进行处理(下载到指定目录/直接把文件返回前端,)
具体代码如下:
一、加解密方式
使用亦或方式加密+解密
二、controller代码:
private FileEncUtil fileEncUtil;
@Autowired
public void setFileEncUtil(FileEncUtil fileEncUtil) {
this.fileEncUtil = fileEncUtil;
}
@ApiOperation("【上传文件】-【测试加密】")
@PostMapping("/uploadFile")
public Result<Boolean> uploadFilejiami(@RequestParam("file") @ApiParam(value = "二进制文件流") MultipartFile file) throws Exception {
Boolean aBoolean = fileEncUtil.EncFile(file);
return new Result<Boolean>().ok(aBoolean);
}
@ApiOperation("【下载文件】-【测试解密和下载】")
@GetMapping("/downloadFile/{fileName}")
public Result<Boolean> downloadFile(@PathVariable @ApiParam(value = "文件名") String fileName, HttpServletResponse response) throws Exception {
Boolean aBoolean = fileEncUtil.DecFile(fileName,response);
return new Result<Boolean>().ok(aBoolean);
}
三、自定义文件加密解密工具类
package com.pasture.pastureService.modules.third;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.file.Files;
/**
* @Classname test
* @Description:文件加密解密工具类
* @Date: 2024-01-08 10:12
* @AUTHOR: 无泪之城
* @Version 1.0
*/
@Component
public class FileEncUtil {
private static final int numOfEncAndDec = 0x255;//定义密钥
private static int dataOfFile = 0;
private static String FOLDER_PATH = "E:\\桌面\\";//存储加密后文件路径
/**
* 加密文件
*
* @param srcFile
* @throws Exception
*/
public Boolean EncFile(MultipartFile srcFile) throws Exception {
if (srcFile.isEmpty()) {
System.out.println("source file not exixt");
return false;
}
InputStream fis = srcFile.getInputStream();
OutputStream fos = Files.newOutputStream(new File(FOLDER_PATH + srcFile.getOriginalFilename()).toPath());
while ((dataOfFile = fis.read()) > -1) {
fos.write(dataOfFile ^ numOfEncAndDec);
}
fis.close();
fos.flush();
fos.close();
return true;
}
/**
* 解密文件
*
* @param fileName
* @return
* @throws Exception
*/
public Boolean DecFile(String fileName, HttpServletResponse resp) throws Exception {
if (fileName == null) {
//加密文件不存在
return false;
}
//设置文件MIME类型
resp.setContentType("application/octet-stream");
//设置Content-Disposition
resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
InputStream fis = Files.newInputStream(new File(FOLDER_PATH + fileName).toPath());
OutputStream fos = resp.getOutputStream();
while ((dataOfFile = fis.read()) > -1) {
fos.write(dataOfFile ^ numOfEncAndDec);
}
//写文件
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
fis.close();
fos.flush();
fos.close();
return true;
}
/**
* 测试
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// File yuanFile = new File("E:\\桌面\\工作计划表-郭震宇.xlsx");
// File encFile = new File("E:\\桌面\\加密后.xlsx");
// EncFile(yuanFile,encFile);
// File encFile = new File("E:\\桌面\\总办1-工作计划表.xlsx");
// File decFile = new File("E:\\桌面\\解密后.xlsx");
// DecFile(encFile,decFile);
}
}
四、其他说明
以上代码,实现了文件上传加密、文件解密并下载功能,其他的具体需求,比如文件名入库等操作,自行根据自己项目业务需求进行操作即可~
日期:2024-01-08 16:14:47 星期一
本文来自博客园,作者:青喺半掩眉砂,转载请注明原文链接:https://www.cnblogs.com/xiaoguo-java/p/17952700