接收并解压实现:
/**
* 功能描述: 导入主域名配置信息
*
* @param:
* @date: 2021/4/19 15:37
*/
@PreAuth(AuthConstant.HAS_ROLE_SYS_ADMIN)
@PostMapping("/import")
@ApiOperation(value = "导入主域名配置信息", notes = "导入主域名配置信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "file", value = "文件"),
@ApiImplicitParam(name = "password", value = "解压密码")
})
public R parse(@RequestParam("file") MultipartFile file, String password) throws Exception {
if (ObjectUtil.isEmpty(file) || StringUtil.isBlank(password)) {
throw new Exception("入参非法");
}
File zipFile = null;
File unzipFile = null;
String zipDest = null;
String unzipDest = null;
String fileName = null;
try {
if (!file.isEmpty()) {
fileName = file.getOriginalFilename();
String fileExtension = FilenameUtils.getExtension(fileName);
if (!StringPool.ZIP.equals(fileExtension)) {
throw new Exception("No Support extension.");
}
zipDest = prefixPath + System.currentTimeMillis();
unzipDest = prefixPath + System.currentTimeMillis();
zipFile = new File(zipDest);
zipFile.mkdirs();
file.transferTo(new File(zipDest, fileName));// 将zip文件放到临时目录
unzipFile = new File(unzipDest);
unzipFile.mkdirs();
CompressUtils.unZip(new File(zipDest + CharPool.SLASH + fileName), unzipDest, password);
}
String content = FileUtil.readToString(new File(unzipDest + CharPool.SLASH + fileName.replace("zip", "txt")));
if (StringUtils.isNotBlank(content)) {
ZoneDTO zoneDTO = JsonUtil.parseWithException(content, ZoneDTO.class);
return dnsZoneService.checkAndSaveZone(zoneDTO);
}
return R.fail("解析失败");
} catch (Exception e) {
log.warn("解析异常:{}", e);
return R.fail("解析异常");
} finally {
// 删除零时文件夹
if (ObjectUtil.isNotEmpty(zipFile)) {
FileUtil.deleteQuietly(zipFile);
}
if (ObjectUtil.isNotEmpty(unzipFile)) {
FileUtil.deleteQuietly(unzipFile);
}
}
}
1,其中prefixPath如下,
yml配置
dns:
prefixPath:
local:
D:\\dns\\
remote:
/usr/local/dns/
local:表示本地路径;remote:表示服务器路径
注意点:File类的mkdir()方法只能创建一级文件夹。若想创建多级文件夹使用mkdirs()。
2,主要涉及工具类
解码工具类
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
/**
* 对文件进行压缩和加密
* 对文件进行解压和解密
*
* @author fenghao
*/
public class CompressUtils {
/**
* 解压加密的压缩文件
*
* @param zipfile
* @param dest
* @param passwd
* @throws ZipException
*/
public static void unZip(File zipfile, String dest, String passwd) throws ZipException {
ZipFile zfile = new ZipFile(zipfile);
// zfile.setFileNameCharset("GBK");//在GBK系统中需要设置
if (!zfile.isValidZipFile()) {
throw new ZipException("压缩文件不合法,可能已经损坏!");
}
File file = new File(dest);
if (file.isDirectory() && !file.exists()) {
file.mkdirs();
}
if (zfile.isEncrypted()) {
zfile.setPassword(passwd.toCharArray());
}
zfile.extractAll(dest);
}
/**
* 压缩文件且加密
*
* @param src
* @param dest
* @param is
* @param passwd
*/
public static void zip(String src, String dest, boolean is, String passwd) {
File srcfile = new File(src);
//创建目标文件
String destname = buildDestFileName(srcfile, dest);
ZipParameters par = new ZipParameters();
par.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
par.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
if (passwd != null) {
par.setEncryptFiles(true);
par.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
par.setPassword(passwd.toCharArray());
}
try {
ZipFile zipfile = new ZipFile(destname);
if (srcfile.isDirectory()) {
if (!is) {
File[] listFiles = srcfile.listFiles();
ArrayList<File> temp = new ArrayList<File>();
Collections.addAll(temp, listFiles);
zipfile.addFiles(temp, par);
}
zipfile.addFolder(srcfile, par);
} else {
zipfile.addFile(srcfile, par);
}
} catch (ZipException e) {
e.printStackTrace();
}
}
/**
* 目标文件名称
*
* @param srcfile
* @param dest
* @return
*/
public static String buildDestFileName(File srcfile, String dest) {
if (dest == null) {//没有给出目标路径时
if (srcfile.isDirectory()) {
dest = srcfile.getParent() + File.separator + srcfile.getName() + ".zip";
} else {
String filename = srcfile.getName().substring(0, srcfile.getName().lastIndexOf("."));
dest = srcfile.getParent() + File.separator + filename + ".zip";
}
} else {
createPath(dest);//路径的创建
if (dest.endsWith(File.separator)) {
String filename = "";
if (srcfile.isDirectory()) {
filename = srcfile.getName();
} else {
filename = srcfile.getName().substring(0, srcfile.getName().lastIndexOf("."));
}
dest += filename + ".zip";
}
}
return dest;
}
/**
* 路径创建
*
* @param dest
*/
private static void createPath(String dest) {
File destDir = null;
if (dest.endsWith(File.separator)) {
destDir = new File(dest);//给出的是路径时
} else {
destDir = new File(dest.substring(0, dest.lastIndexOf(File.separator)));
}
if (!destDir.exists()) {
destDir.mkdirs();
}
}
}
文件工具类
import com.telecom.csn.common.constant.CharPool;
import com.telecom.csn.common.constant.Charsets;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.FileSystemUtils;
import org.springframework.util.PatternMatchUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
public class FileUtil extends org.springframework.util.FileCopyUtils {
/**
* 默认为true
*
* @author L.cm
*/
public static class TrueFilter implements FileFilter, Serializable {
private static final long serialVersionUID = -6420452043795072619L;
public final static TrueFilter TRUE = new TrueFilter();
@Override
public boolean accept(File pathname) {
return true;
}
}
/**
* 扫描目录下的文件
*
* @param path 路径
* @return 文件集合
*/
public static List<File> list(String path) {
File file = new File(path);
return list(file, TrueFilter.TRUE);
}
/**
* 扫描目录下的文件
*
* @param path 路径
* @param fileNamePattern 文件名 * 号
* @return 文件集合
*/
public static List<File> list(String path, final String fileNamePattern) {
File file = new File(path);
return list(file, pathname -> {
String fileName = pathname.getName();
return PatternMatchUtils.simpleMatch(fileNamePattern, fileName);
});
}
/**
* 扫描目录下的文件
*
* @param path 路径
* @param filter 文件过滤
* @return 文件集合
*/
public static List<File> list(String path, FileFilter filter) {
File file = new File(path);
return list(file, filter);
}
/**
* 扫描目录下的文件
*
* @param file 文件
* @return 文件集合
*/
public static List<File> list(File file) {
List<File> fileList = new ArrayList<>();
return list(file, fileList, TrueFilter.TRUE);
}
/**
* 扫描目录下的文件
*
* @param file 文件
* @param fileNamePattern Spring AntPathMatcher 规则
* @return 文件集合
*/
public static List<File> list(File file, final String fileNamePattern) {
List<File> fileList = new ArrayList<>();
return list(file, fileList, pathname -> {
String fileName = pathname.getName();
return PatternMatchUtils.simpleMatch(fileNamePattern, fileName);
});
}
/**
* 扫描目录下的文件
*
* @param file 文件
* @param filter 文件过滤
* @return 文件集合
*/
public static List<File> list(File file, FileFilter filter) {
List<File> fileList = new ArrayList<>();
return list(file, fileList, filter);
}
/**
* 扫描目录下的文件
*
* @param file 文件
* @param filter 文件过滤
* @return 文件集合
*/
private static List<File> list(File file, List<File> fileList, FileFilter filter) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
list(f, fileList, filter);
}
}
} else {
// 过滤文件
boolean accept = filter.accept(file);
if (file.exists() && accept) {
fileList.add(file);
}
}
return fileList;
}
/**
* 获取文件后缀名
* @param fullName 文件全名
* @return {String}
*/
public static String getFileExtension(String fullName) {
Assert.notNull(fullName, "file fullName is null.");
String fileName = new File(fullName).getName();
int dotIndex = fileName.lastIndexOf('.');
return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
}
/**
* 获取文件名,去除后缀名
* @param file 文件
* @return {String}
*/
public static String getNameWithoutExtension(String file) {
Assert.notNull(file, "file is null.");
String fileName = new File(file).getName();
int dotIndex = fileName.lastIndexOf(CharPool.DOT);
return (dotIndex == -1) ? fileName : fileName.substring(0, dotIndex);
}
/**
* Returns the path to the system temporary directory.
*
* @return the path to the system temporary directory.
*/
public static String getTempDirPath() {
return System.getProperty("java.io.tmpdir");
}
/**
* Returns a {@link File} representing the system temporary directory.
*
* @return the system temporary directory.
*/
public static File getTempDir() {
return new File(getTempDirPath());
}
/**
* Reads the contents of a file into a String.
* The file is always closed.
*
* @param file the file to read, must not be {@code null}
* @return the file contents, never {@code null}
*/
public static String readToString(final File file) {
return readToString(file, Charsets.UTF_8);
}
/**
* Reads the contents of a file into a String.
* The file is always closed.
*
* @param file the file to read, must not be {@code null}
* @param encoding the encoding to use, {@code null} means platform default
* @return the file contents, never {@code null}
*/
public static String readToString(final File file, final Charset encoding) {
try (InputStream in = Files.newInputStream(file.toPath())) {
return IoUtil.readToString(in, encoding);
} catch (IOException e) {
throw Exceptions.unchecked(e);
}
}
/**
* Reads the contents of a file into a String.
* The file is always closed.
*
* @param file the file to read, must not be {@code null}
* @return the file contents, never {@code null}
*/
public static byte[] readToByteArray(final File file) {
try (InputStream in = Files.newInputStream(file.toPath())) {
return IoUtil.readToByteArray(in);
} catch (IOException e) {
throw Exceptions.unchecked(e);
}
}
/**
* Writes a String to a file creating the file if it does not exist.
*
* @param file the file to write
* @param data the content to write to the file
*/
public static void writeToFile(final File file, final String data) {
writeToFile(file, data, Charsets.UTF_8, false);
}
/**
* Writes a String to a file creating the file if it does not exist.
*
* @param file the file to write
* @param data the content to write to the file
* @param append if {@code true}, then the String will be added to the
* end of the file rather than overwriting
*/
public static void writeToFile(final File file, final String data, final boolean append){
writeToFile(file, data, Charsets.UTF_8, append);
}
/**
* Writes a String to a file creating the file if it does not exist.
*
* @param file the file to write
* @param data the content to write to the file
* @param encoding the encoding to use, {@code null} means platform default
*/
public static void writeToFile(final File file, final String data, final Charset encoding) {
writeToFile(file, data, encoding, false);
}
/**
* Writes a String to a file creating the file if it does not exist.
*
* @param file the file to write
* @param data the content to write to the file
* @param encoding the encoding to use, {@code null} means platform default
* @param append if {@code true}, then the String will be added to the
* end of the file rather than overwriting
*/
public static void writeToFile(final File file, final String data, final Charset encoding, final boolean append) {
try (OutputStream out = new FileOutputStream(file, append)) {
IoUtil.write(data, out, encoding);
} catch (IOException e) {
throw Exceptions.unchecked(e);
}
}
/**
* 转成file
* @param multipartFile MultipartFile
* @param file File
*/
public static void toFile(MultipartFile multipartFile, final File file) {
try {
FileUtil.toFile(multipartFile.getInputStream(), file);
} catch (IOException e) {
throw Exceptions.unchecked(e);
}
}
/**
* 转成file
* @param in InputStream
* @param file File
*/
public static void toFile(InputStream in, final File file) {
try (OutputStream out = new FileOutputStream(file)) {
FileUtil.copy(in, out);
} catch (IOException e) {
throw Exceptions.unchecked(e);
}
}
/**
* Moves a file.
* <p>
* When the destination file is on another file system, do a "copy and delete".
*
* @param srcFile the file to be moved
* @param destFile the destination file
* @throws NullPointerException if source or destination is {@code null}
* @throws IOException if source or destination is invalid
* @throws IOException if an IO error occurs moving the file
*/
public static void moveFile(final File srcFile, final File destFile) throws IOException {
Assert.notNull(srcFile, "Source must not be null");
Assert.notNull(destFile, "Destination must not be null");
if (!srcFile.exists()) {
throw new FileNotFoundException("Source '" + srcFile + "' does not exist");
}
if (srcFile.isDirectory()) {
throw new IOException("Source '" + srcFile + "' is a directory");
}
if (destFile.exists()) {
throw new IOException("Destination '" + destFile + "' already exists");
}
if (destFile.isDirectory()) {
throw new IOException("Destination '" + destFile + "' is a directory");
}
final boolean rename = srcFile.renameTo(destFile);
if (!rename) {
FileUtil.copy(srcFile, destFile);
if (!srcFile.delete()) {
FileUtil.deleteQuietly(destFile);
throw new IOException("Failed to delete original file '" + srcFile + "' after copy to '" + destFile + "'");
}
}
}
/**
* Deletes a file, never throwing an exception. If file is a directory, delete it and all sub-directories.
* <p>
* The difference between File.delete() and this method are:
* <ul>
* <li>A directory to be deleted does not have to be empty.</li>
* <li>No exceptions are thrown when a file or directory cannot be deleted.</li>
* </ul>
*
* @param file file or directory to delete, can be {@code null}
* @return {@code true} if the file or directory was deleted, otherwise
* {@code false}
*/
public static boolean deleteQuietly(@Nullable final File file) {
if (file == null) {
return false;
}
try {
if (file.isDirectory()) {
FileSystemUtils.deleteRecursively(file);
}
} catch (final Exception ignored) {
}
try {
return file.delete();
} catch (final Exception ignored) {
return false;
}
}
}