org.kaizen4j.common.util.FileUtils Maven / Gradle / Ivy
package org.kaizen4j.common.util;
import com.google.common.base.Throwables;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import java.io.*;
import java.util.*;
import static java.util.Objects.nonNull;
import static org.kaizen4j.common.base.Symbols.*;
/**
* 文件工具类
*
* @author John
*/
public final class FileUtils {
private static final int randomRange = 999;
/**
* 创建一个新的文件,该文件包含的文件目录也会被同时创建
*
* @param fullname 包含文件路径的文件名称
* @return 成功创建地文件
*
* @throws IOException
*/
public static File createFile(String fullname) {
File file = new File(fullname);
try {
createPath(file.getParent());
if (!file.exists()) {
file.createNewFile();
}
return file;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 创建文件目录
*
* @param path 文件目录
*/
public static void createPath(String path) {
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
}
/**
* 文件写入
*
* @param file 文件对象
* @param bytes 写入字节数组
*
* @throws IOException
*/
public static void writeFile(File file, byte[] bytes) {
OutputStream writer = null;
try {
writer = new BufferedOutputStream(new FileOutputStream(file));
writer.write(bytes);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (nonNull(writer)) {
writer.flush();
writer.close();
}
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
/**
* 解析 MultipartHttpServletRequest 对象中的文件列表
*
* @param multipartRequest
* @return 返回 MultipartFile 对象集合
*/
public static List getMultipartFiles(
MultipartHttpServletRequest multipartRequest) {
List files = new ArrayList<>();
Optional.ofNullable(multipartRequest).map(MultipartHttpServletRequest::getFileNames)
.ifPresent(iterator -> iterator
.forEachRemaining(name -> files.add(multipartRequest.getFile(name))));
return files;
}
/**
* 上传文件
*
* @param files List
* @param savePath 文件保存的绝对路径
* @param folderName 文件保存的文件夹名称
* @return 以文件名为 key,文件的相对路径为 value 的 Map
*
* @throws IOException
*/
public static Map uploadFileToMap(List files, String savePath,
String folderName) {
Map map = new HashMap<>();
for (MultipartFile file : files) {
if (file.isEmpty()) {
continue;
}
// 重命名文件名
String originalFilename = file.getOriginalFilename();
String filename = randomName(originalFilename);
// 创建文件路径
String fileAbsolutePath = createPath(savePath, folderName);
String fileRelativePath = createPath(EMPTY, folderName) + filename;
// 创建文件
File saveFolder = new File(fileAbsolutePath);
if (!saveFolder.exists()) {
saveFolder.mkdirs();
}
File saveFile = new File(fileAbsolutePath + filename);
try {
writeFile(saveFile, file.getBytes());
} catch (IOException e) {
throw new RuntimeException(e);
}
map.put(originalFilename, fileRelativePath.replaceAll("\\\\", SLASH));
}
return map;
}
/**
* 上传文件
*
* @param files List
* @param savePath 文件保存的绝对路径
* @param folderName 文件保存的文件夹名称
* @return 文件的相对路径的 List
*
* @throws IOException
*/
public static List uploadFileToList(List files, String savePath,
String folderName) {
List list = new ArrayList<>();
for (MultipartFile file : files) {
if (file.isEmpty()) {
continue;
}
// 重命名文件名
String originalFilename = file.getOriginalFilename();
String filename = randomName(originalFilename);
// 创建文件路径
String fileAbsolutePath = createPath(savePath, folderName);
String fileRelativePath = createPath(EMPTY, folderName) + filename;
// 创建文件
File saveFolder = new File(fileAbsolutePath);
if (!saveFolder.exists()) {
saveFolder.mkdirs();
}
File saveFile = new File(fileAbsolutePath + filename);
try {
writeFile(saveFile, file.getBytes());
} catch (IOException e) {
throw new RuntimeException(e);
}
list.add(fileRelativePath.replaceAll("\\\\", SLASH));
}
return list;
}
/**
* 生成文件夹路径(文件保存的绝对路径+文件夹名称+当前日期)
*
* @param savePath 文件保存的绝对路径
* @param folderName 文件夹名称
* @return 生成的路径
*/
public static String createPath(String savePath, String folderName) {
StringBuffer path = new StringBuffer();
path.append(savePath);
path.append(File.separator);
path.append(folderName);
path.append(File.separator);
path.append(DateUtils.currentDateString("yyyyMMdd"));
path.append(File.separator);
return path.toString();
}
/**
* 生成随机文件名(当前时间毫秒+[0-999]随机数+原始文件名称后缀)
*
* @param originalFilename 原始文件名称
* @return 生成的文件名
*/
public static String randomName(String originalFilename) {
StringBuffer name = new StringBuffer();
name.append(System.currentTimeMillis());
name.append(new Random().nextInt(randomRange));
name.append(originalFilename.substring(originalFilename.lastIndexOf(DOT)));
return name.toString();
}
/**
* 获取文件目录及其子目录下的所有文件
*
* @param folder 文件目录
* @return 所有文件列表
*/
public static List allFiles(final File folder) {
List filesList = new ArrayList();
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
filesList.addAll(allFiles(fileEntry));
} else {
filesList.add(fileEntry);
}
}
return filesList;
}
/**
* 获取文件目录及其子目录下的符合扩展名过滤的所有文件
*
* @param folder 文件目录
* @param extensions 文件扩展名数组
* @return 所有过滤后的文件列表
*/
public static List allFiles(final File folder, String... extensions) {
List filesList = new ArrayList();
List allFiles = allFiles(folder);
for (File file : allFiles) {
// 文件扩展名过滤
for (String extension : extensions) {
if (file.getName().toLowerCase().endsWith(extension.toLowerCase().trim())) {
filesList.add(file);
break;
}
}
}
return filesList;
}
}