spring boot上传文件并自动解压

作者:
淡白
创建时间:
2020-05-15 08:35:44
spring boot zip4j

摘要:这段代码展示了如何将上传的文件进行解压到指定目录的业务实现。首先,使用zip4j库进行文件解压,该库支持加密、解密压缩,以及文件的添加、删除等功能。然后,在控制器中判断上传文件的后缀是否是.zip,如果是,则调用服务进行文件解压。服务部分主要实现了将元数据保存到数据库,并保存文件后进行解压的操作。文件工具类中的方法用于保存文件、获取应用程序路径以及进行zip文件的解压操作。最后,调用解压方法将文件解压到指定目录,并返回解压成功的提示信息。

业务需要把上传文件解压到指定目录

依赖

zip4j功能比较强大,支持加密、解密压缩,支持文件的添加、删除等

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

控制器

判断文件后缀是不是.zip 进行服务调用

@PostMapping("/uploadWallpaper")
    @ResponseBody
    public Response uploadFile(@RequestParam("file") MultipartFile file,Wallpaper wallpaper){
        //后缀.zip
        if(FileUtils.getPrefix(file.getOriginalFilename()).toLowerCase().equals(Wallpaper.File_PREFIX)){
            return wallpaperService.saveWallpaper(file,wallpaper);
        }
        return Response.Err("不是.zip结尾的压缩包");
    }

服务

主要业务实现,把元数据存入数据库.保存文件(zip)后进行解压.

public Response saveWallpaper(MultipartFile file, Wallpaper wallpaper){
        //设置id(行数+1)
        wallpaper.setId(WallpaperSize()+1);
        wallpaper.setUrl("127.0.0.1:8081/wallpaper/"+wallpaper.getId()+"/index.html");
        wallpaper.setAudit(false);
        //添加到数据库
        wallpaperMapper.insert(wallpaper);
        String path=FileUtils.getApplicationPath()+"wallpaper"+File.separator+wallpaper.getId()+"."+Wallpaper.File_PREFIX;
        //保存到服务器
        FileUtils.saveFile(file,path);
        String destPath=FileUtils.getApplicationPath()+"wallpaper"+File.separator+wallpaper.getId()+File.separator;
        //解压
            if(FileUtils.unPackZip(new File(path),"",destPath)){
            return Response.Ok("上传成功",wallpaper.getUrl());
        }
        return Response.Err("上传失败");
    }

文件工具类

文件保存,文件解压的工具类

public class FileUtils {
    public static String getPrefix(String filename){
        return filename.substring(filename.lastIndexOf(".")+1);
    }
    public static boolean saveFile(MultipartFile file,String path){
        File desFile = new File(path);
        if(!desFile.getParentFile().exists()){
            desFile.mkdirs();
        }
        try {
            file.transferTo(desFile);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    public static String getApplicationPath(){
        //获取classpath
        ApplicationHome h = new ApplicationHome(WallpaperApplication.class);
        File jarF = h.getSource();
        return jarF.getParentFile()+ File.separator;
    }
    /**
     * zip文件解压
     *
     * @param destPath 解压文件路径
     * @param zipFile  压缩文件
     * @param password 解压密码(如果有)
     */
    public static boolean unPackZip(File zipFile, String password, String destPath) {
        try {
            ZipFile zip = new ZipFile(zipFile);
            zip.extractAll(destPath);
            // 如果解压需要密码
            if (zip.isEncrypted()) {
                zip.setPassword(password);
            }
        } catch (Exception e) {
            System.out.println(e);
            return false;
        }
        return true;
    }
}