该工具类,为本人在项目中所遇问题或所需功能酝酿出来的产物,适应日常情况下的文件上传功能需求。下面把该工具类所需依赖也摆出来。
<!-- log4j日志依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.8.0-beta4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.8.0-beta4</version>
</dependency>
<!-- IO流 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- 处理base64格式数据的依赖 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 上传文件类
*/
public class FileUtils {
// 使用日志
private static Logger logger = Logger.getLogger(FileUtils.class);
/**
* 批量处理request中的普通表单项和文件表单项,并返回一个Map集合
* 该Map集合存储有所有请求参数的值,包括上传文件最终保存文件的文件URL
* @param request
* @return
* @throws Exception
*/
public static Map<String, Object> uploadFile(HttpServletRequest request) throws Exception {
logger.info("<<<<<<<<<<<<------- FileUtils类:uploadFile()文件上传方法 -> 开始(" + GeneralUtils.date2Str(new Date()) + ") ------->>>>>>>>>>>>");
// 创建Map集合用于存储结果集或错误信息
Map<String, Object> resultMap = new HashMap<String, Object>();
// 定义MultipartHttpServletRequest类型变量
MultipartHttpServletRequest multipartHttpServletRequest = null;
/*
判断传递进来的参数request是不是属于MultipartHttpServletRequest类型
判断原因:为了适应SpringBoot和SpringMVC框架
1. SpringBoot中,请求在进入Controller之前,如果携带有上传文件,
则会自动在过滤器中将HttpServletRequest类型的request解析成MultipartHttpServletRequest类型;
2. SpringMVC中,则不会自动解析。
因此需要进行判断,再决定是否能够直接强转类型。
*/
if (request instanceof MultipartHttpServletRequest) {
// 如果是,则直接将HttpServletRequest类型的request强制转换为MultipartHttpServletRequest类型
multipartHttpServletRequest = (MultipartHttpServletRequest) request;
} else {
// 如果不是,创建CommonsMultipartResolver类型解析器
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
/*
判断当前request是不是包含有enctype="multipart/form-data"属性
判断原因:主要用于区分第一点和第二点。
1. 如果是Swagger页面发送的请求,有文件表单项,但没有选择文件上传
那么该request判断的时候,不是enctype="multipart/form-data"类型;
2. 如果是前端页面发送请求,因为设置了enctype="multipart/form-data"类型,
所以该request是enctype="multipart/form-data"类型,因此无影响。
*/
boolean flag = commonsMultipartResolver.isMultipart(request);
if (flag) {
// 解析HttpServletRequest类型的request为MultipartHttpServletRequest类型
multipartHttpServletRequest = commonsMultipartResolver.resolveMultipart(request);
}
}
// 如果multipartHttpServletRequest等于null,说明request中不包含上传文件
if (multipartHttpServletRequest == null) {
// 保存所有普通表单项的请求参数和参数值
resultMap.putAll(GeneralUtils.getParameterMap(request));
logger.info("FileUtils.java ->> uploadFile() ->> 该表单只包含有普通表单项,并不包含有上传文件(" + GeneralUtils.date2Str(new Date()) + ")");
logger.info("<<<<<<<<<<<<------- FileUtils类:uploadFile()文件上传方法 -> 结束(" + GeneralUtils.date2Str(new Date()) + ") ------->>>>>>>>>>>>");
// 返回结果集
return resultMap;
}
// 保存所有普通表单项的请求参数和参数值
resultMap.putAll(GeneralUtils.getParameterMap(multipartHttpServletRequest));
// 得到存储有所有MultipartFile文件的Map集合
Map<String, MultipartFile> multipartFileMap = multipartHttpServletRequest.getFileMap();
// 得到存储有MultipartFile文件的Set集合
Set<Map.Entry<String, MultipartFile>> set = multipartFileMap.entrySet();
// 循环遍历得到每一个Entry
for (Map.Entry<String, MultipartFile> entry : set) {
// 得到每一个MultipartFile对象
MultipartFile multipartFile = entry.getValue();
// 得到文件表单项的name属性的值
String formFileName = multipartFile.getName();
// 得到上传文件的原文件名称
String originalFileName = multipartFile.getOriginalFilename();
// logger.info("FileUtils.java ->> uploadFile() ->> 当前上传文件的源文件名称 = " + originalFileName);
// 如果上传文件的原文件名称为空,说明当前的文件输入框没选择上传文件
if (GeneralUtils.isEmpty(originalFileName)) {
// 保存对应name属性的属性值为null
resultMap.put(formFileName, "");
// 进入下一次循环
continue;
}
// 得到上传文件的后缀及文件类型
Map<String, Object> getFileSuffixAndFileType_Map = FileUtils.getFileSuffixAndFileType(originalFileName);
// 获取错误信息
String errorMsg = (String) getFileSuffixAndFileType_Map.get("errorMsg");
// 如果错误信息不等于空
if (GeneralUtils.notEmpty(errorMsg)) {
logger.info("FileUtils.java ->> uploadFile() ->> 上传文件异常:" + errorMsg + "(" + GeneralUtils.date2Str(new Date()) + ")");
logger.info("<<<<<<<<<<<<------- FileUtils类:uploadFile()文件上传方法 -> 结束(" + GeneralUtils.date2Str(new Date()) + ") ------->>>>>>>>>>>>");
resultMap.clear();
resultMap.put("errorMsg", errorMsg);
return resultMap;
}
// 得到上传文件的后缀
String uploadFileSuffix = (String) getFileSuffixAndFileType_Map.get("uploadFileSuffix");
// 得到上传文件的类型
String uploadFileTypeMark = (String) getFileSuffixAndFileType_Map.get("uploadFileTypeMark");
// logger.info("FileUtils.java ->> uploadFile() ->> 当前上传文件的文件后缀 = " + uploadFileSuffix);
// logger.info("FileUtils.java ->> uploadFile() ->> 当前上传文件的文件类型 = " + uploadFileTypeMark);
// 定义上传文件的文件类型目录
String uploadFileTypeDir = null;
// 如果等于image表示是图片
if ("image".equals(uploadFileTypeMark)) {
uploadFileTypeDir = "uploadImages";
} else { // 否则表示其他类型的文件
uploadFileTypeDir = "uploadFiles";
}
// 得到保存文件的前缀路径
String saveUploadFilePrefixDirectory = FileUtils.getSaveUploadFilePrefixDirectory(request, uploadFileTypeDir);
// 定义保存文件的日期目录
String saveUploadFileDateDirectory = GeneralUtils.date2Str(new Date(), "yyyyMMdd");
// 得到保存文件的完整目录
File saveUploadFileCompleteDirectory_File = new File(saveUploadFilePrefixDirectory, saveUploadFileDateDirectory);
// 如果目录不存在的话
if (! saveUploadFileCompleteDirectory_File.exists()) {
saveUploadFileCompleteDirectory_File.mkdirs();
}
// logger.info("FileUtils.java ->> uploadFile() ->> 最终保存文件的完整目录路径 = " + saveUploadFileCompleteDirectory_File.getPath());
// 定义保存文件的文件名称,带后缀
String saveUploadFileName = GeneralUtils.get32UUID() + uploadFileSuffix;
// 得到保存文件的最终File类型对象
File saveFile = new File(saveUploadFileCompleteDirectory_File, saveUploadFileName);
String lastFileName = saveUploadFileName;
while (saveFile.exists()) {
lastFileName = GeneralUtils.get32UUID() + uploadFileSuffix;
saveFile = new File(saveUploadFileCompleteDirectory_File, lastFileName);
}
// logger.info("FileUtils.java ->> uploadFile() ->> 最终保存文件的文件名称 = " + lastFileName);
// 得到MultipartFile中的资源输入流
InputStream input = multipartFile.getInputStream();
// 读取输入流中的文件,并通过输出流保存
FileUtils.inputReadAndOutputWrite(input, saveFile);
String resultFileName = uploadFileTypeDir + "/" + saveUploadFileDateDirectory + "/" + lastFileName;
// logger.info("FileUtils.java ->> uploadFile() ->> 最终保存到数据库的文件路径 = " + resultFileName);
// 保存上传文件最终保存的文件URL到map集合中
resultMap.put(formFileName, resultFileName);
}
logger.info("<<<<<<<<<<<<------- FileUtils类:uploadFile()文件上传方法 -> 结束(" + GeneralUtils.date2Str(new Date()) + ") ------->>>>>>>>>>>>");
return resultMap;
}
/**
* 根据上传的文件判断文件所属类型及返回文件后缀
* 文件所属类型:图片或其他
* @param fileName 文件名称
* @return
* @throws Exception
*/
private static Map<String, Object> getFileSuffixAndFileType(String fileName) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
if (GeneralUtils.isEmpty(fileName)) {
logger.info("FileUtils.java ->> getFileSuffixAndFileType() ->> 错误操作:参数fileName不能为空!(" + GeneralUtils.date2Str(new Date()) + ")");
throw new RuntimeException("错误操作:参数fileName不能为空!");
}
int index = fileName.lastIndexOf(".");
String uploadFileSuffix = null;
if (index == -1) {
logger.info("FileUtils.java ->> getFileSuffixAndFileType() ->> 错误操作:参数fileName(" + fileName + ")不属于文件类型(没有带扩展名)!(" + GeneralUtils.date2Str(new Date()) + ")");
resultMap.put("mark", false);
resultMap.put("errorMsg", "错误操作:参数fileName(" + fileName + ")不属于文件类型(没有带扩展名)!");
return resultMap;
} else {
uploadFileSuffix = fileName.substring(index);
}
String uploadFileTypeMark = null;
if (".jpeg".equals(uploadFileSuffix) || ".jpg".equals(uploadFileSuffix)
|| ".png".equals(uploadFileSuffix) || ".gif".equals(uploadFileSuffix)) {
uploadFileTypeMark = "image";
} else {
uploadFileTypeMark = "other";
}
resultMap.put("mark", true);
resultMap.put("uploadFileSuffix", uploadFileSuffix);
resultMap.put("uploadFileTypeMark", uploadFileTypeMark);
return resultMap;
}
/**
* 得到用于保存上传文件的前缀路径
* @param request
* @param uploadFileTypeDir
* @return
* @throws Exception
*/
private static String getSaveUploadFilePrefixDirectory(HttpServletRequest request, String uploadFileTypeDir) throws Exception {
// 定义资源输入流,专门用于读取path.properties属性文件
InputStream pathPropertiesInput = null;
// 定义用于保存文件的前缀路径
String saveUploadFilePrefixDirectory = null;
try {
// 读取类路径下的path.properties属性文件
pathPropertiesInput = FileUtils.class.getClassLoader().getResourceAsStream("path.properties");
// 如果资源输入流不为空
if (pathPropertiesInput != null) {
// 定义Properties集合用于读取路径资源输入流
Properties props = new Properties();
// 把资源输入流中的属性加载到Properties集合中
props.load(pathPropertiesInput);
// 如果Properties集合的长度大于0
if (props.size() > 0) {
// 获取其中的filePath属性的值
String filePath = props.getProperty("filePath");
// 如果filePath属性的值不为空
if (GeneralUtils.notEmpty(filePath)) {
// 判断filePath属性的值最后一个字符是否等于 "/"
if (filePath.lastIndexOf("/") == (filePath.length() - 1)) {
saveUploadFilePrefixDirectory = filePath + uploadFileTypeDir + "/";
} else {
saveUploadFilePrefixDirectory = filePath + "/" + uploadFileTypeDir + "/";
}
} else {
saveUploadFilePrefixDirectory = request.getServletContext().getRealPath("/static/" + uploadFileTypeDir + "/");
}
} else {
saveUploadFilePrefixDirectory = request.getServletContext().getRealPath("/static/" + uploadFileTypeDir + "/");
}
} else {
saveUploadFilePrefixDirectory = request.getServletContext().getRealPath("/static/" + uploadFileTypeDir + "/");
}
} catch (Exception e) {
logger.info("FileUtils.java ->> getSaveUploadFilePrefixDirectory() ->> 异常信息:" + e);
throw new RuntimeException(e);
} finally {
try {
if (pathPropertiesInput != null) {
pathPropertiesInput.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return saveUploadFilePrefixDirectory;
}
/**
* 读取输入流,并通过输出流写出
* @param input
* @param file
* @throws Exception
*/
public static void inputReadAndOutputWrite(InputStream input, File file) throws Exception {
// 定义资源输出流,用于将文件输入流写出
OutputStream saveUploadFileOutput = null;
try {
// 关联最终保存文件的File类型对象
saveUploadFileOutput = new FileOutputStream(file);
// 定义字节数组,用作缓冲区
byte[] buf = new byte[1024];
// 定义int变量记录每次读取到字节数组中的有效长度
int len = 0;
// 循环读取
while ((len = input.read(buf)) != -1) {
// 写操作
saveUploadFileOutput.write(buf, 0, len);
}
// 刷新
saveUploadFileOutput.flush();
} catch (Exception e) {
logger.info("FileUtils.java ->> inputReadAndOutputWrite() ->> 异常信息:" + e + "(" + GeneralUtils.date2Str(new Date()) + ")");
throw new RuntimeException(e);
} finally {
try {
if (input != null) {
input.close();
}
if (saveUploadFileOutput != null) {
saveUploadFileOutput.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
上面是处理 使用enctype="multipart/form-data"上传的文件
============================================================================================
下面是处理 使用base64数据上传的文件
*/
/**
* 处理base64上传文件的方法
* @param request
* @param paramName
* @return
* @throws Exception
*/
public static Map<String, Object> uploadFile(HttpServletRequest request, String paramName) throws Exception {
logger.info("========================= FileUtils.java ->> uploadFile()上传文件的方法 ->> 开始(" + GeneralUtils.date2Str(new Date()) + ")=========================");
Map<String, Object> resultMap = new HashMap<>();
// 得到base64数据主体
String base64Data = request.getParameter(paramName);
logger.info("FileUtils.java ->> uploadFile() ->> 获取到的base64数据 = " + base64Data);
if (base64Data == null || "".equals(base64Data) || base64Data.trim().isEmpty()) {
resultMap.put("status", 444);
resultMap.put("msg", "错误操作:根据指定的请求参数名称获取到的参数为空");
logger.info("FileUtils.java ->> uploadFile() ->> 错误操作:根据指定的请求参数名称获取到的参数为空");
logger.info("========================= FileUtils.java ->> uploadFile()上传文件的方法 ->> 结束(" + GeneralUtils.date2Str(new Date()) + ")=========================");
return resultMap;
}
/*
1,获取到上传文件的扩展名以及文件类别目录
*/
String prefix = null;
String dataBody = null;
if (base64Data.contains("base64,")) {
String[] strArr = base64Data.split("base64,");
if (strArr.length == 2) {
prefix = strArr[0];
dataBody = strArr[1];
} else {
resultMap.put("status", 444);
resultMap.put("msg", "错误操作:base64数据格式错误");
logger.info("FileUtils.java ->> uploadFile() ->> 错误操作:base64数据格式错误");
logger.info("========================= FileUtils.java ->> uploadFile()上传文件的方法 ->> 结束(" + GeneralUtils.date2Str(new Date()) + ")=========================");
return resultMap;
}
}
logger.info("FileUtils.java ->> uploadFile() ->> 切割得到的数据前缀prefix = " + prefix);
logger.info("FileUtils.java ->> uploadFile() ->> 切割得到的base64数据主体dataBody = " + dataBody);
String extensionName = null;
if (prefix != null) {
if ("data:text/plain;".equals(prefix)) {
extensionName = ".txt";
} else if ("data:application/vnd.ms-excel;".equals(prefix)) {
extensionName = ".xls";
} else if ("data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;".equals(prefix)) {
extensionName = ".xlsx";
} else if ("data:application/msword;".equals(prefix)) {
extensionName = ".doc";
} else if ("data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;".equals(prefix)) {
extensionName = ".docx";
} else if ("data:application/vnd.ms-powerpoint;".equals(prefix)) {
extensionName = ".ppt";
} else if ("data:application/vnd.openxmlformats-officedocument.presentationml.presentation;".equals(prefix)) {
extensionName = ".pptx";
} else if ("data:image/jpeg;".equals(prefix)) {
extensionName = ".jpeg";
} else if ("data:image/jpg;".equals(prefix)) {
extensionName = ".jpg";
} else if ("data:image/png;".equals(prefix)) {
extensionName = ".png";
} else if ("data:image/gif;".equals(prefix)) {
extensionName = ".gif";
}
} else {
resultMap.put("status", 444);
resultMap.put("msg", "错误操作:获取文件扩展名错误");
logger.info("FileUtils.java ->> uploadFile() ->> 错误操作:获取文件扩展名错误");
logger.info("========================= FileUtils.java ->> uploadFile()上传文件的方法 ->> 结束(" + GeneralUtils.date2Str(new Date()) + ")=========================");
return resultMap;
}
logger.info("FileUtils.java ->> uploadFile() ->> 获取到的文件扩展名extensionName = " + extensionName);
// 定义上传文件的文件类型目录
String uploadFileTypeDir = null;
if (".jpeg".equalsIgnoreCase(extensionName) || ".jpg".equalsIgnoreCase(extensionName)
|| ".png".equalsIgnoreCase(extensionName) || ".gif".equalsIgnoreCase(extensionName)) {
uploadFileTypeDir = "uploadImages";
} else {
uploadFileTypeDir = "uploadFiles";
}
logger.info("FileUtils.java ->> uploadFile() ->> 获取到的文件类型目录uploadFileTypeDir = " + uploadFileTypeDir);
/*
2,得到保存文件的File对象
*/
String saveFileRootPath = null;
InputStream input = null;
try {
input = FileUtils.class.getClassLoader().getResourceAsStream("path.properties");
if (input != null) {
Properties props = new Properties();
props.load(input);
if (props.size() > 0) {
String filePath = props.getProperty("filePath");
logger.info("FileUtils.java ->> uploadFile() ->> 从path.properties属性文件中读取到的filePath属性 = " + filePath);
if (filePath != null && !"".equals(filePath) && !filePath.trim().isEmpty()) {
if (filePath.lastIndexOf("/") == (filePath.length() - 1)) {
saveFileRootPath = filePath;
} else {
saveFileRootPath = filePath.concat("/");
}
} else {
saveFileRootPath = request.getServletContext().getRealPath("/static/");
}
} else {
saveFileRootPath = request.getServletContext().getRealPath("/static/");
}
} else {
saveFileRootPath = request.getServletContext().getRealPath("/static/");
}
} catch (Exception e) {
logger.info("FileUtils.java ->> uploadFile() ->> 异常信息:" + e);
logger.info("========================= FileUtils.java ->> uploadFile()上传文件的方法 ->> 结束(" + GeneralUtils.date2Str(new Date()) + ")=========================");
throw new RuntimeException(e);
} finally {
try {
if (input != null) {
input.close();
logger.info("FileUtils.java ->> uploadFile() ->> 关闭path.properties属性文件的资源输入流");
}
} catch (Exception e) {
e.printStackTrace();
}
}
logger.info("FileUtils.java ->> uploadFile() ->> 保存文件的根目录saveFileRootPath = " + saveFileRootPath);
// 得到保存文件的日期目录
String saveFileDateDir = new SimpleDateFormat("yyyyMMdd").format(new Date());
logger.info("FileUtils.java ->> uploadFile() ->> 日期目录saveFileDateDir = " + saveFileDateDir);
// 得到保存文件的完整目录
String saveFilePath = saveFileRootPath.concat(uploadFileTypeDir).concat("/").concat(saveFileDateDir);
logger.info("FileUtils.java ->> uploadFile() ->> 保存文件的完整目录saveFilePath = " + saveFilePath);
// 不存在则创建目录
File savePathFile = new File(saveFilePath);
if (! savePathFile.exists()) {
savePathFile.mkdirs();
}
// 得到保存文件的名称
String saveFileName = GeneralUtils.get32UUID().concat(extensionName);
File saveFile = new File(savePathFile, saveFileName);
while (saveFile.exists()) {
saveFileName = GeneralUtils.get32UUID().concat(extensionName);
saveFile = new File(saveFilePath, saveFileName);
}
logger.info("FileUtils.java ->> uploadFile() ->> 保存文件的名称saveFileName = " + saveFileName);
/*
3,处理base64主体数据并保存上传文件
*/
OutputStream output = null;
try {
output = new FileOutputStream(saveFile);
byte[] bytes = Base64.decodeBase64(dataBody.getBytes(StandardCharsets.UTF_8));
// 校验错误数据
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] < 0) {
bytes[i] += 256;
}
}
output.write(bytes);
output.flush();
} catch (Exception e) {
logger.info("FileUtils.java ->> uploadFile() ->> 异常信息:" + e);
logger.info("========================= FileUtils.java ->> uploadFile()上传文件的方法 ->> 结束(" + GeneralUtils.date2Str(new Date()) + ")=========================");
throw new RuntimeException(e);
} finally {
try {
if (output != null) {
output.close();
logger.info("FileUtils.java ->> uploadFile() ->> 关闭保存文件的资源输出流");
}
} catch (Exception e) {
e.printStackTrace();
}
}
String result = uploadFileTypeDir.concat("/").concat(saveFileDateDir).concat("/").concat(saveFileName);
logger.info("FileUtils.java ->> uploadFile() ->> 最终返回的保存文件路径result = " + result);
resultMap.put("status", 200);
resultMap.put("data", result);
logger.info("========================= FileUtils.java ->> uploadFile()上传文件的方法 ->> 结束(" + GeneralUtils.date2Str(new Date()) + ")=========================");
return resultMap;
}
/*
上面是处理 base64上传文件的方法
=================================================================================
下面是其他关于文件的方法
*/
/**
* 得到文件在服务器上的访问地址
* @param fileName
* @return
* @throws Exception
*/
public static String getFileAccessPath(HttpServletRequest request, String fileName) throws Exception {
InputStream input = null;
String path = null;
try {
if(GeneralUtils.isEmpty(fileName)) {
logger.info("FileUtils.java ->> getFileAccessPath() ->> 异常信息:文件名称不能为空!(" + GeneralUtils.date2Str(new Date()) + ")");
throw new RuntimeException("异常信息:文件名称不能为空!");
}
input = FileUtils.class.getClassLoader().getResourceAsStream("path.properties");
if(input != null) {
Properties props = new Properties();
props.load(input);
if(props.size() > 0) {
String serverPath = props.getProperty("serverPath");
System.out.println("serverPath = " + serverPath);
if(GeneralUtils.notEmpty(serverPath)) {
if(serverPath.lastIndexOf("/") == (serverPath.length() - 1)) {
path = serverPath + fileName;
} else {
path = serverPath + "/" + fileName;
}
}
}
}
if(path == null) {
// 得到保存目录在当前项目中的真实路径
path = request.getServletContext().getRealPath("/static/") + fileName;
}
} catch (Exception e) {
logger.info("FileUtils.java ->> getFileAccessPath() ->> 异常信息:" + e + "(" + GeneralUtils.date2Str(new Date()) + ")");
throw new RuntimeException(e);
} finally {
try {
if(input != null) {
input.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return path;
}
/**
* 得到文件/文件夹的完整路径
* 可以得到在服务器上时的文件/文件夹路径
* 也可以得到在window下项目中的文件/文件夹路径
* @param request
* @param fileName
* @return
* @throws Exception
*/
public static String getAbsolutePath(HttpServletRequest request, String fileName) throws Exception {
InputStream input = null;
try {
if(GeneralUtils.isEmpty(fileName)) {
logger.info("FileUtils.java ->> getAbsolutePath() ->> 异常:文件名称不能为空!(" + GeneralUtils.date2Str(new Date()) + ")");
throw new RuntimeException("异常:文件名称不能为空!");
}
String path = null;
// 读取属性文件,如果是在服务器上部署,则该文件应该制定有保存文件的路径
input = GeneralUtils.class.getClassLoader().getResourceAsStream("path.properties");
if(input != null) {
Properties props = new Properties();
props.load(input);
if(props.size() > 0) {
// 读取属性名为filePath的值
String filePath = props.getProperty("filePath");
// 如果不为空
if(filePath != null && ! "".equals(filePath) && !filePath.trim().isEmpty()) {
if(filePath.lastIndexOf("/") != (filePath.length() - 1)) {
path = filePath + "/" + fileName;
} else {
path = filePath + fileName;
}
}
}
}
String contextPath = null;
// 如果path值为空,说明配置文件中没有指定路径的值
if(path == null || "".equals(path)) {
// 手动指定保存目录
contextPath = "/static/";
// 得到保存目录在当前项目中的真实路径
path = request.getServletContext().getRealPath(contextPath) + fileName;
}
// 得到path的File对象
File file = new File(path);
// 如果file不存在
if(! file.exists()) {
logger.info("FileUtils.java ->> getAbsolutePath() ->> 异常:文件在路径下(" + path + ")找不到!(" + GeneralUtils.date2Str(new Date()) + ")");
throw new RuntimeException("异常:文件在路径下(" + path + ")找不到!");
}
return file.getAbsolutePath();
} catch (Exception e) {
logger.info("FileUtils.java ->> getAbsolutePath() ->> 异常信息:" + e + "(" + GeneralUtils.date2Str(new Date()) + ")");
throw new RuntimeException(e);
} finally {
try {
if(input != null) {
input.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 删除文件或文件夹
* @param file
*/
public static void deleteFile (File file) {
// 判断文件是否存在
if(! file.exists()) {
logger.info("FileUtils.java ->> deleteFile() ->> 错误操作:指定的文件不存在!(" + GeneralUtils.date2Str(new Date()) + ")");
throw new RuntimeException("错误操作:指定的文件不存在!");
}
// 判断file是不是文件夹类型
if(file.isDirectory()) {
// 得到文件夹下面的所有文件夹及文件的File对象
File[] subFiles = file.listFiles();
if (subFiles != null) {
// 循环遍历每个File
for(int i = 0; i < subFiles.length; i++) {
// 递归
deleteFile(subFiles[i]);
}
} else {
// 删除文件夹
file.delete();
}
} else { // 如果不是则表示属于文件
// 得到当前文件的父目录
File parentFile = file.getParentFile();
// 得到所有的子文件
File[] subFiles = parentFile.listFiles();
if (subFiles != null) {
// 判断父目录下的子文件个数是否等于1
if(subFiles.length == 1) {
// 删除子文件
file.delete();
// 删除父目录
parentFile.delete();
} else {
// 否则说明父目录仍有多个子文件,所以直接删除文件即可
file.delete();
}
} else {
file.delete();
}
}
}
}