单个文件上传
第一种方法:
/**
*
* @param file 需要上传的文件
* @param baseUrl 上传地址
* @param uploadName 上传文件如果要更改文件名称,该字段为要更改的名称,不需要更改则该参数应为空字符串或null
*/
public static void upload(MultipartFile file,String baseUrl,String uploadName){
// 1、获取文件的原始文件名, 通过原始文件名获取文件后缀 例如:abc.jpg
String originalFilename = file.getOriginalFilename();
//后缀文件类型。如:.txt .png
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//文件前缀名称
String prefixName = originalFilename.substring(0, originalFilename.lastIndexOf("."));
// 2、使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
String fileName = "";
if (StringUtils.isNotEmpty(uploadName)){
fileName = uploadName + suffix;
}else {
fileName = originalFilename;
}
// 3、创建一个目录对象
File dir = new File(baseUrl);
//判断当前目录是否存在
if (!dir.exists()) {
boolean mkdirs = dir.mkdirs();
if (!mkdirs) {
throw new CommonException(CommonCode.FILE_UPDATE_ERROR);
}
}
try {
// 4、将临时文件转存到指定位置
file.transferTo(new File(baseUrl+File.separator + fileName));
} catch (IOException e) {
e.printStackTrace();
}
}
第二种方法:
public void upload(@RequestParam("file")MultipartFile file ){
try {
// 1、获取文件的原始文件名, 通过原始文件名获取文件后缀 例如:abc.jpg
String originalFilename = file.getOriginalFilename();
//后缀文件类型。如:.txt .png
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//文件前缀名称
String prefixName = originalFilename.substring(0, originalFilename.lastIndexOf("."));
//TODO 要上传的文件地址,应从配置文件或者数据库中读取。本地测试时可以写 :D:\\uploadFile
String resultUrl = "";
// 2、创建一个目录对象
File dir = new File(resultUrl);
//判断当前目录是否存在
if (!dir.exists() || (!dir.isDirectory())) {
dir.mkdirs();
}
//3、若文件已存在,重命名为历史文件
File uploadFile = new File(resultUrl+ File.separator+ originalFilename);
//数据入库
if (uploadFile.exists()){
String rename = "重命名后的名称";
File renameFile = new File(resultUrl+File.separator+prefixName+"-"+rename+suffix);
com.google.common.io.Files.copy(uploadFile,renameFile);
}
// 4、将临时文件转存到指定位置
file.transferTo(uploadFile);
}catch (Exception e){
e.printStackTrace();
}
}
如果上述代码出现:com.google.common.io找不到
请在pom.xml文件中加入一下配置:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0-jre</version>
</dependency>
多个文件单个字段上传(就是多次调用单个文件上传):
/**
* 多个文件单个字段上传:例如:file : [logo.jpg , name.txt]
* @param files
* @param baseUrl
*/
public static void uploadFiles(MultipartFile[] files,String baseUrl,String uploadName){
for (MultipartFile file : files) {
upload(file,baseUrl,uploadName);
}
}
多个文件多个字段上传:
在apifox中测试应该为:
/**
* 多个文件多字段上传。例如: file1:logo.png , file2:name.txt
* @param request
*/
public static void uploadFiles(MultipartHttpServletRequest request){
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if (multipartResolver.isMultipart(request)){
//上传多个文件,每个字段一个文件
Iterator<String> fileNames = request.getFileNames();
while (fileNames.hasNext()){
//取得上传的文件
String uploadName = fileNames.next();
MultipartFile file = request.getFile(uploadName);
if (file != null){
String projectPath = request.getSession().getServletContext().getRealPath("/");
String originalFilename = file.getOriginalFilename();
String temFile = projectPath + System.currentTimeMillis() + "_" + originalFilename;
File targetFile = new File(temFile);
try {
file.transferTo(targetFile);
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
注意:
在调用多个文件多个字段的方法时如果出现java.lang.ClassNotFoundException: org.apache.commons.fileupload.disk.DiskFileItemFactory的解决方法:
如果出现以上错误,请在pom.xml中引入
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>