一、单文件上传
- static目录下定义HTML页面,index.html(8080默认打开页)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SpringBoot文件上传页面</title>
</head>
<body>
<form method="post" action="/upload" enctype="multipart/form-data">
文件 : <input type="file" name="upload">
<input type="submit" value="上传">
</form>
</body>
- 在启动类里配置上传文件的配置(@Bean)
// 文件上传配置类
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//文件最大10M
factory.setMaxFileSize(DataSize.parse("10240KB")); //KB,MB
/// 设置总上传数据总大小10M
factory.setMaxRequestSize(DataSize.parse("102400KB"));
return factory.createMultipartConfig();
}
- Controller
@Controller
public class UploadController {
@PostMapping("/upload")
public @ResponseBody String upload(MultipartFile upload) {
// 1. 获取要上传文件的文件名
String fileName = upload.getOriginalFilename();
System.out.println(fileName);
// 2. 自定义上传路径
String path = "C:\\Users\\16670\\Desktop";
// 3. 判断路径是否存在,不存在则新建
File file = new File(path);
if (!file.exists()){
file.mkdir();
}
// 3.改名,避免重名,定义新文件的名字
String newName = path+File.separator+
System.currentTimeMillis()+
fileName.substring(fileName.lastIndexOf("."));
try {
upload.transferTo(new File(newName));
return "上传成功";
} catch (IOException e) {
return "上传失败";
}
}
}
单文件上传结果:

二、多文件上传
- HTML页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SpringBoot文件上传页面</title>
</head>
<body>
<form method="post" action="/upload" enctype="multipart/form-data">
文件1 : <input type="file" name="upload">
文件2 : <input type="file" name="upload">
文件3 : <input type="file" name="upload">
<input type="submit" value="上传">
</form>
</body>
- 配置类与单文件的配置相同!
- Controller类, 遍历数组,
@Controller
public class UploadController {
@PostMapping("/multiUpload")
public @ResponseBody
JsonData upload(MultipartFile[] upload) {
// 1. 定义上传路径
String path = "C:\\Users\\16670\\Desktop\\upload";
// 2. 判断路径是否存在,不存在则新建
File file = new File(path);
if (!file.exists()){
file.mkdir();
}
for (MultipartFile multipartFile : upload) {
// 3. 循环获取要上传文件的文件名
String fileName = multipartFile.getOriginalFilename();
System.out.println(fileName);
// 4.改名,避免重名,定义新文件的名字
// 报字符串越界,查找中发现,应该是取某一个字符的位置时,出错了,原来使用lastIndexOf时要取得这个字符在被查找的字符串里没有。
// 解决方法,在取位置之前,先要验证一下,字符是否存在。
assert fileName != null;
if(fileName.lastIndexOf(".")!=-1){
fileName = fileName.substring(0, fileName.lastIndexOf("."));
}
String newName = path + File.separator + System.currentTimeMillis() + fileName;
try {
multipartFile.transferTo(new File(newName));
} catch (IOException e) {
e.printStackTrace();
return JsonData.buildFail();
}
}
// return "上传成功";
return JsonData.buildSuccess(null);
}
}
- 结果:


注意1:多文件上传时,返回的类型为
JsonData,这是我自定义的一个返回json字符串的类型,定义了成功和失败时的静态方法,因为前端需要的是json字符串格式,所以,定义一个JsonData类来返回json字符串。
JsonData.java类
public class JsonData {
private Integer code;
private String msg;
private Object data;
public JsonData() {
}
public JsonData(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// 成功200
public static JsonData buildSuccess(Object data){
return new JsonData(200,"操作成功",data);
}
// 失败400
public static JsonData buildFail(){
return new JsonData(400,"操作失败",null);
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
注意2:多文件上传有一个坑,那就是上传多个文件时,没问题,上传部分文件时,会报错,数组下标越界异常,
解决办法是: 对文件名进行lastIndexOf时要取得这个字符在被查找的字符串里是否存在。 在取位置之前,先要验证一下,字符是否存在。
if(fileName.lastIndexOf(".")!=-1){
fileName = fileName.substring(0, fileName.lastIndexOf("."));
}
本文介绍了如何在SpringBoot项目中配置单文件上传,并解决了多文件上传时遇到的字符串越界问题。通过实例展示了HTML表单、配置类、Controller处理流程和自定义返回JSON数据的方法。
1585





