首先创建一个存放参数的类 Constants
package com.example.demo.util;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Constants {
// 系统变量
// 线上 linux
public static final String COMPUTER_USER_NAME = "/root";
public static final String UPLOAD_DIRECTORY = "upload";
// windows
public static final String DRIVE_LETTER = "D";
}
工具类FileUtil
package com.example.demo.util;
import org.apache.tika.mime.MimeTypeException;
import org.apache.tika.mime.MimeTypes;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileUtil {
public static boolean isWindows() {
return System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS");
}
public static String getExtension(String contentType) {
MimeTypes allTypes = MimeTypes.getDefaultMimeTypes();
String extension = null;
try {
extension = allTypes.forName(contentType).getExtension();
} catch (MimeTypeException e) {
e.printStackTrace();
}
return extension;
}
/**
* @param file
* @param request
* @return
* 例如如下传了个文件后的操作:
* bigType: application
* extension: .pdf
* uploadPath: \upload\application
* fileName: 1565157799645_3CDDB9B08A2D1DF34DF6221F4874A956.pdf
* dirPath: D:\upload\application\2019\08\07
* filePath: D:\upload\application\2019\08\07\1565157799645_3CDDB9B08A2D1DF34DF6221F4874A956.pdf
* returnPath: /upload/application/2019/08/07/1565157799645_3CDDB9B08A2D1DF34DF6221F4874A956.pdf
*/
public static String save(MultipartFile file, HttpServletRequest request) {
//获取的内容类型 bigType
String bigType = file.getContentType().split("/")[0];
//获取文件名的后缀 extension 例如pdf文件则为 .pdf
String extension = getExtension(file.getContentType());
SimpleDateFormat df = new SimpleDateFormat(File.separator + "yyyy" + File.separator + "MM" + File.separator + "dd");
Date now = new Date();
/**
file.separator这个代表系统目录中的间隔符,说白了就是斜线,不过有时候需要双线,有时候是单线,你用这个静态变量就解决兼容问题了。
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常。
比如说要在temp目录下建立一个test.txt文件,在Windows下应该这么写:
File file1 = new File ("C:\tmp\test.txt");
在linux下则是这样的:
File file2 = new File ("/tmp/test.txt");
如果要考虑跨平台,则最好是这么写:
File myFile = new File("C:" + File.separator + "tmp" + File.separator, "test.txt");
**/
//获取的内容类型 上传的地址
String uploadPath = File.separator + Constants.UPLOAD_DIRECTORY + File.separator + bigType;
//文件名称
String fileName = now.getTime() + "_" + request.getSession().getId() + extension;
//判断当前是部署在windows还是Linux上,在生成上传地址
String dirPath = (isWindows() ? Constants.DRIVE_LETTER + ":" : Constants.COMPUTER_USER_NAME + "") + uploadPath + df.format(now);
//生成要存放到的地址的文件地址及其文件名
String filePath = dirPath + File.separator + fileName;
//“\”是转义字符,“\\”表示的是一个"\",以此类推,“\\\\”表示两个"\";\\\\\\\\”表示的是四个"\"。
String returnPath = filePath.substring(filePath.indexOf(uploadPath)).replaceAll("\\\\", "/");
File dir = new File(dirPath);
if (!dir.exists()) {
// 如果该文件不存在,则生成该目录
dir.mkdirs();
}
File newFile = new File(filePath);
try {
//服务器上文件上传的地址+文件名 (即上传文件)
file.transferTo(newFile);
return returnPath;
} catch (IOException e) {
return null;
}
}
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
//System.out.println("删除单个文件" + fileName + "成功!");
return true;
} else {
//System.out.println("删除单个文件" + fileName + "失败!");
return false;
}
} else {
//System.out.println("删除单个文件失败:" + fileName + "不存在!");
return false;
}
}
}