阅读完需:约 4 分钟
具体的理论:
首先在springboot里面StandardServletMultipartResolver
是基本不需要配置的,因为有自动化配置了,而且springboot肯定满足servlet3.0的要求。
例子:

直接创建上传文件:
@RestController
public class FileUploadController {
SimpleDateFormat s=new SimpleDateFormat("/yyyy/MM/dd/");//创建日期来分类
@RequestMapping(value="/upload")
public String upload(MultipartFile file , HttpServletRequest request ) {
String format=s.format(new Date());
String r=request.getServletContext().getRealPath("/img")+format;//获取根目录
File folder=new File(r);//创建文件
if(!folder.exists()){
folder.mkdirs();
}
String oldname=file.getOriginalFilename();//获取旧的名字
String newname= UUID.randomUUID().toString()+oldname.substring(oldname.lastIndexOf("."));
//替换新的名字
try {
file.transferTo(new File(folder,newname));
String url=request.getScheme()+"://"+ request.getServerName()+":"+request.getServerPort()+"/img"+format+newname;
return url;//返回上传图片的路径
} catch (IOException e) {
e.printStackTrace();
}
return "error";
}
}
基本上使用 StandardServletMultipartResolver
直接写上传文件的逻辑就可以了!
要注意的是上传的格式必须是POST,GET无法上传!!
编写html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
</body>
</html>
结果:


同样 StandardServletMultipartResolver
遵循着springboot的原则,如果你自定义了默认的配置就失效了,自定义也在 application.properties
里面。

多文件上传:
多文件只需要在单文件上修改一下就可以了
前端的html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/uploads" method="post" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<input type="submit" value="提交">
</form>
</body>
</html>
在后端的FileUploadController
里增加一个新的方法:
@RequestMapping(value="/uploads")
public String uploads(MultipartFile[] files , HttpServletRequest request ) {
String format=s.format(new Date());
String r=request.getServletContext().getRealPath("/img")+format;//获取根目录
File folder=new File(r);//创建文件
if(!folder.exists()){
folder.mkdirs();
}
for (MultipartFile file:files){
String oldname=file.getOriginalFilename();//获取旧的名字
String newname= UUID.randomUUID().toString()+oldname.substring(oldname.lastIndexOf("."));
//替换新的名字
try {
file.transferTo(new File(folder,newname));
String url=request.getScheme()+"://"+ request.getServerName()+":"+request.getServerPort()+"/img"+format+newname;
System.out.println(url); //返回上传图片的路径
} catch (IOException e) {
e.printStackTrace();
}
}
return "YES";
}
只要将MultipartFile
变成数组,并且用for循环去遍历就可以上传文件了
结果:

java中File转为MultipartFile的四种方式
因为在开发中需要调用其他人的上传文件接口,然而他们的接口文件上传参数类型是MultipartFile,所以需要转为MultipartFile类型
File转MultipartFile
方法一
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
public static MultipartFile getMultipartFile(File file) {
FileItem item = new DiskFileItemFactory().createItem("file"
, MediaType.MULTIPART_FORM_DATA_VALUE
, true
, file.getName());
try (InputStream input = new FileInputStream(file);
OutputStream os = item.getOutputStream()) {
// 流转移
IOUtils.copy(input, os);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid file: " + e, e);
}
return new CommonsMultipartFile(item);
}
可以设置为静态方法,也可以使用对象进行调用
File file = new File("D:\\a.txt")
MultipartFile cMultiFile = getMultipartFile(file);
方法二
// 第二种方式
public static MultipartFile getMultipartFile(File file) {
DiskFileItem item = new DiskFileItem("file"
, MediaType.MULTIPART_FORM_DATA_VALUE
, true
, file.getName()
, (int)file.length()
, file.getParentFile());
try {
OutputStream os = item.getOutputStream();
os.write(FileUtils.readFileToByteArray(file));
} catch (IOException e) {
e.printStackTrace();
}
return new CommonsMultipartFile(item);
}
可以设置为静态方法,也可以使用对象进行调用
File file = new File("D:\\a.txt");
MultipartFile cMultiFile = getMultipartFile(file);
方法三
public static FileItem createFileItem(String filePath, String fileName){
String fieldName = "file";
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item = factory.createItem(fieldName, "text/plain", false,fileName);
File newfile = new File(filePath);
int bytesRead = 0;
byte[] buffer = new byte[8192];
try (FileInputStream fis = new FileInputStream(newfile);
OutputStream os = item.getOutputStream()) {
while ((bytesRead = fis.read(buffer, 0, 8192))!= -1)
{
os.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
return item;
}
File file = new File("D:\\a.txt");
FileItem fileItem = createFileItem(file.getPath(),file.getName());
MultipartFile cMultiFile = new CommonsMultipartFile(fileItem);
方法四
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
利用测试框架来模拟
import org.springframework.mock.web.MockMultipartFile;
File file = new File("D:\\a.txt");
MultipartFile cMultiFile = new MockMultipartFile("file", file.getName(), null, new FileInputStream(file));