文件加密解密工具类

发布时间 2024-01-08 16:23:28作者: 青喺半掩眉砂

:需求:文件上传到系统后,只能通过系统预览或者下载,其他方式下载下来的文件,对方看不了,
实现思路:上传文件时,对文件进行加密处理,数据库存放文件名,把加密文件存到指定目录下
预览、下载文件时,通过指定目录+文件名,找到该文件,并进行解密处理,根据前端需求,对解密后的文件进行处理(下载到指定目录/直接把文件返回前端,)

具体代码如下:

一、加解密方式

使用亦或方式加密+解密

二、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 星期一