基于java实现zip文件上传至服务器
package com.research.business.controller;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ZipUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.research.common.annotation.Anonymous;
import com.research.common.core.domain.AjaxResult;
import com.research.common.core.domain.R;
import com.research.process.mapper.CityAndCountyMapper;
import com.research.process.mapper.PdfCodeMapper;
import com.research.process.service.CityAndCountyService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
-
文件上传
-
@author zjl
-
@description TODO
-
@time: 2023/8/27 17:02
*/
@Anonymous
@RestController
@RequestMapping("/uploadFile")
public class FileUploadController {private static final Logger log = LoggerFactory.getLogger(FileUploadController.class);
@Resource
private PdfCodeMapper pdfCodeMapper;@Resource
private CityAndCountyService cityAndCountyService;// 设置上传文件保存的目录
@Value("${file.UPLOAD_DIR}")
private String UPLOAD_DIR;@PostMapping("/upload")
public AjaxResult multiFace(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return AjaxResult.error("请选择要上传的压缩文件");
} else if (!Objects.requireNonNull(file.getOriginalFilename()).toLowerCase().endsWith(".zip")) {
log.error("不是有效的.zip文件");
return AjaxResult.error("不是有效的.zip文件");
}try {
//获取文件全名
String fileName = file.getOriginalFilename();
log.info("上传的压缩包名称为:" + fileName);//解压目标文件夹对象(压缩文件解压到此文件夹中)
File extractFolder = new File(UPLOAD_DIR);//压缩包存储目标文件对象
File destFile = new File(UPLOAD_DIR + fileName);//文件上传路径对象
File fileDirectory = new File(UPLOAD_DIR);
log.info("上传的压缩包的保存路径为:" + fileDirectory);//当上传路径不存在时,生成上传路径
if (!fileDirectory.exists()) {
fileDirectory.mkdirs();
log.info("压缩包的上传路径 " + fileDirectory + " 不存在,已创建");
}//调用处理压缩包文件方法得到返回结果
return dealZip(file, subName(file), destFile, extractFolder);} catch (Exception e) {
e.printStackTrace();
log.error("文件上传失败");
return AjaxResult.error("文件上传失败");
}
}/**
-
处理压缩包文件
-
@param zipFile 上传压缩包
-
@param destFile 源文件
-
@param extractFolder 解压后文件夹
-
@return R 返回实体类
*/
private AjaxResult dealZip(MultipartFile zipFile, String fileName, File destFile, File extractFolder) {
//判断解压后文件夹是否存在
if (!extractFolder.exists()) {
//不存在就创建
extractFolder.mkdirs();
log.info("解压后文件夹目录 " + extractFolder + " 不存在,已创建");
}
try {
//步骤1、把上传的压缩包文件保存到指定压缩包路径
zipFile.transferTo(destFile);
} catch (IOException e) {
//运行报错直接返回错误信息
return AjaxResult.error(e.getMessage());
}//步骤2、调用Hutool的ZipUtil压缩工具类的unzip方法来进行对压缩包文件的解压,解压到指定目录
ZipUtil.unzip(destFile, extractFolder, CharsetUtil.CHARSET_GBK);//解压缩完删除原文件(可不删)
// destFile.delete();//步骤3、获取解压后目录下所有的文件
File[] pdfsUnzip = extractFolder.listFiles();
log.info("压缩包解压后的内容:" + Arrays.toString(pdfsUnzip));//对获取到的文件数组进行判空校验
if (pdfsUnzip == null || pdfsUnzip.length == 0) {
//不存在就把压缩文件夹删除(可不删)
extractFolder.delete();
log.error("上传失败,压缩包为空");
return AjaxResult.error("上传失败,压缩包为空");
}//调用方法对解析出来的文件重命名,并移动到指定目录下(/research/pdf)
File file = new File(extractFolder + "/" + fileName);
String changeNameResult = changeName(file, fileName);
if ("文件重命名成功".equals(changeNameResult)) {
return AjaxResult.success(file);
} else {
log.error(changeNameResult);
return AjaxResult.error(changeNameResult);
}
}
/**
-
@description 修改pdf文件名称为编码, 并把文件移动到指定目录下(/research/pdf)
-
@author zjl
-
@date 2023/9/1 15:32
*/
public String changeName(File file, String fileName) {
//文件转存路径对象
Path targetDirectory = Paths.get("/research/pdf/");
File targetDirectoryFile = new File("/research/pdf/");
// Path targetDirectory = Paths.get("D:/research/pdf/");
// File targetDirectoryFile = new File("D:/research/pdf/");
//当转存路径不存在时,生成转存路径
if (!targetDirectoryFile.exists()) {
targetDirectoryFile.mkdirs();
log.info("保存pdf文档的目录 " + targetDirectoryFile + " 不存在,已创建");
}try {
//检查该文件是否是一个目录,如果是目录则获取目录中的所有文件和子目录
if (file.isDirectory()) {
File[] files = file.listFiles();
log.info("重命名的文件为" + Arrays.toString(files));//如果目录不为空,则遍历
if (files != null) {
for (int i = 0; i < files.length; i++) {//如果目录的子集是文件,则进入下方处理
if (files[i].isFile()) {
log.info("需重命名的文件为:" + files[i]);//获取文件的文件名,根据文件名中的 _ 个数,判断文件层级。(3个是市级,4个是地区级)
String name = files[i].getName();
String fileType = getFileType(name);
int count = name.split("").length - 1;
String[] parts = name.split("");//如果为3个 _ 说明当前文件为地市级,取出对应地市的名称,将文件名替换为对应地市的编码
//例如:杭州市_20230815_模板名称_2023082214542212.pdf
if (count == 4) {
//取出地市名称,根据名称在数据库中查询对应的编码。
String city = parts[0];
String cityId = pdfCodeMapper.selectByName(city);
if (null == cityId) {
log.error(name + ",文件重命名失败!");
continue;
}
String searchFilename = cityId + fileType;
log.info("重命名后的文件名称为:" + searchFilename);
//判断当前的编码名称的文件是否已经存在,若存在则需要先删除。renameTo方法不支持覆盖,若存在重名文件会报错
boolean fileExists = searchFiles(new File(UPLOAD_DIR + "/" + fileName), searchFilename);
if (fileExists) {
new File(UPLOAD_DIR + fileName, searchFilename).delete();
files[i].renameTo(new File(UPLOAD_DIR + "/" + fileName + "/" + searchFilename));
} else {
files[i].renameTo(new File(UPLOAD_DIR + "/" + fileName + "/" + searchFilename));
}
//把文件移动到/research/pdf目录下,重复的覆盖
Path sourceFile = Paths.get(UPLOAD_DIR + "/" + fileName + "/" + searchFilename);
Files.move(sourceFile, targetDirectory.resolve(sourceFile.getFileName()), StandardCopyOption.REPLACE_EXISTING);//如果为4个 _ 说明当前文件为地区级,取出对应地区的名称,将文件名替换为对应地区的编码
//例如:杭州市_拱墅区_20230815_模板名称_2023082214542212.pdf
} else if (count == 7) {
//取出地市的名称,根据名称在数据库中查询对应的编码。
String city = parts[1];
String cityId = pdfCodeMapper.selectByName(city);
if (null == cityId) {
log.error(name + ",文件重命名失败!");
continue;
}
String searchFilename = cityId + fileType;
log.info("重命名后的文件名称为:" + searchFilename);
//判断当前的编码名称的文件是否已经存在,若存在则需要先删除。renameTo方法不支持覆盖,若存在重名文件会报错
boolean fileExists = searchFiles(new File(UPLOAD_DIR + "/" + fileName), searchFilename);
if (fileExists) {
new File(UPLOAD_DIR + fileName, searchFilename).delete();
files[i].renameTo(new File(UPLOAD_DIR + "/" + fileName + "/" + searchFilename));
} else {
files[i].renameTo(new File(UPLOAD_DIR + "/" + fileName + "/" + searchFilename));
}
//把文件移动到/research/pdf目录下,重复的覆盖
Path sourceFile = Paths.get(UPLOAD_DIR + "/" + fileName + "/" + searchFilename);
Files.move(sourceFile, targetDirectory.resolve(sourceFile.getFileName()), StandardCopyOption.REPLACE_EXISTING);
} else {
log.error(name + ",文件名称格式不正确!");
}}
}
}//解压出来的压缩包没有目录,通过此种方法重命名
} else if (!file.isDirectory()){
File file1 = new File(UPLOAD_DIR);
File[] files = file1.listFiles();
log.info("解压后文件目录为" + Arrays.toString(files));for (int i = 0; i < files.length; i++) {
//如果目录的子集是文件,则进入下方处理
if (files[i].isFile()) {
log.info("需重命名的文件为:" + files[i]);//获取文件的文件名,根据文件名中的 _ 个数,判断文件层级。(3个是市级,4个是地区级)
String name = files[i].getName();
String fileType = getFileType(name);
int count = name.split("").length - 1;
String[] parts = name.split("");//如果为4个 _ 说明当前文件为地市级,取出对应地市的名称,将文件名替换为对应地市的编码
//例如:杭州市_20230815_模板名称_2023082214542212.pdf
if (count == 4) {
//取出地市名称,根据名称在数据库中查询对应的编码。
String city = parts[0];
String cityId = pdfCodeMapper.selectByName(city);
if (null == cityId) {
log.error(name + ",文件重命名失败!");
continue;
}
String searchFilename = cityId + fileType;
log.info("重命名后的文件名称为:" + searchFilename);
//判断当前的编码名称的文件是否已经存在,若存在则需要先删除。renameTo方法不支持覆盖,若存在重名文件会报错
boolean fileExists = searchFiles(new File(UPLOAD_DIR), searchFilename);
if (fileExists) {
new File(UPLOAD_DIR + fileName, searchFilename).delete();
files[i].renameTo(new File(UPLOAD_DIR + "/" + searchFilename));
} else {
files[i].renameTo(new File(UPLOAD_DIR + "/" + searchFilename));
}
//把文件移动到/research/pdf目录下,重复的覆盖
Path sourceFile = Paths.get(UPLOAD_DIR + "/" +searchFilename);
Files.move(sourceFile, targetDirectory.resolve(sourceFile.getFileName()), StandardCopyOption.REPLACE_EXISTING);//如果为7个 _ 说明当前文件为地区级,取出对应地区的名称,将文件名替换为对应地区的编码
//例如:杭州市_拱墅区_20230815_模板名称_2023082214542212.pdf
} else if (count == 7) {
//取出地市的名称,根据名称在数据库中查询对应的编码。
String city = parts[1];
String cityId = pdfCodeMapper.selectByName(city);
if (null == cityId) {
log.error(name + ",文件重命名失败!");
continue;
}
String searchFilename = cityId + fileType;
log.info("重命名后的文件名称为:" + searchFilename);
//判断当前的编码名称的文件是否已经存在,若存在则需要先删除。renameTo方法不支持覆盖,若存在重名文件会报错
boolean fileExists = searchFiles(new File(UPLOAD_DIR), searchFilename);
if (fileExists) {
new File(UPLOAD_DIR + fileName, searchFilename).delete();
files[i].renameTo(new File(UPLOAD_DIR + "/" + searchFilename));
} else {
files[i].renameTo(new File(UPLOAD_DIR + "/" + searchFilename));
}
//把文件移动到/research/pdf目录下,重复的覆盖
Path sourceFile = Paths.get(UPLOAD_DIR + "/" + searchFilename);
Files.move(sourceFile, targetDirectory.resolve(sourceFile.getFileName()), StandardCopyOption.REPLACE_EXISTING);
} else {
log.error(name + ",文件名称格式不正确!");
}
}
}
}
return "文件重命名成功";
} catch (Exception e) {
log.error("文件重命名失败抛出异常: {}", e);
return "文件重命名失败";
}
}
/**
- @description 查找指定目录下的文件
- @author zjl
- @date 2023/9/1 16:33
*/
public static boolean searchFiles(File directory, String filename) {
if (directory.isDirectory()) {
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
// 递归搜索子目录
boolean found = searchFiles(file, filename);
if (found) {
return true;
}
} else if (file.getName().equals(filename)) {
// 找到匹配的文件
return true;
}
}
}
}
return false;
}
/**
- @description 取出文件名,不带后缀
- @author zjl
- @date 2023/9/6 11:35
*/
public String subName(MultipartFile file) {
String fileName = file.getOriginalFilename();
int dotIndex = fileName.lastIndexOf(".");
if (dotIndex > 0) {
return fileName.substring(0, dotIndex);
}
return fileName;
}
/**
- @description 取出文件的后缀
- @author zjl
- @date 2023/9/6 15:34
*/
public String getFileType(String fileName) {
int dotIndex = fileName.lastIndexOf(".");
if (dotIndex > 0 && dotIndex < fileName.length() - 1) {
return fileName.substring(dotIndex);
}
return "";
}
/**
- @description 根据cityId查询cityName并返回
- @author zjl91
- @param[1] null
- @time 2023/9/22 10:06
*/
@PostMapping("/cityList")
@Anonymous
public AjaxResult getCityList(@RequestBody ListresearchCountyList) {
return cityAndCountyService.getCityList(researchCountyList);
}
-
}

浙公网安备 33010602011771号