多种文件上传的方式
示例代码:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.Date;
import java.util.Iterator;
@RestController
@RequestMapping("/upload")
public class UploadController {
/**
* 第一种方式
* 使用传统的流操作读写
* postman:
* POST http://localhost:9090/changyong/upload/fileUpload
* Body选择form-data, 选择要上传的文件, 参数名为file
*
* @param file
* @return
* @throws IOException
*/
@RequestMapping("fileUpload")
public String fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {
//用来检测程序运行时间
long startTime = System.currentTimeMillis();
System.out.println("fileName:" + file.getOriginalFilename());
try {
//目录不存在则创建
String uploadPath = "D:/javatest/fileUpload/";
File directory = new File(uploadPath);
if (!directory.exists()) {
directory.mkdirs();
}
//-------------------------- 主体内容 -----------------------
//获取输出流
OutputStream os = new FileOutputStream(uploadPath + new Date().getTime() + "-" + file.getOriginalFilename());
//获取输入流 CommonsMultipartFile 中可以直接得到文件的流
InputStream is = file.getInputStream();
byte[] bts = new byte[1024];
//一个一个字节的读取并写入
while (is.read(bts) != -1) {
os.write(bts);
}
os.flush();
os.close();
is.close();
//-------------------------- 主体内容 -----------------------
} catch (FileNotFoundException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("采用流上传的方式的运行时间:" + (endTime - startTime) + "ms");
return "success";
}
/**
* 第二种方式
* 采用file.transferTo 来保存上传的文件(推荐)
* postman:
* POST http://localhost:9090/changyong/upload/fileUpload2
* Body选择form-data, 选择要上传的文件,参数名为file
*
* @param file
* @return
* @throws IOException
*/
@RequestMapping("fileUpload2")
public String fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {
long startTime = System.currentTimeMillis();
System.out.println("fileName:" + file.getOriginalFilename());
//目录不存在则创建
String uploadPath = "D:/javatest/fileUpload2/";
File directory = new File(uploadPath);
if (!directory.exists()) {
directory.mkdirs();
}
//-------------------------- 主体内容 -----------------------
//文件路径
String path = uploadPath + new Date().getTime() + "-" + file.getOriginalFilename();
File newFile = new File(path);
//通过CommonsMultipartFile的方法直接写文件(注意这个时候)
file.transferTo(newFile);
//-------------------------- 主体内容 -----------------------
long endTime = System.currentTimeMillis();
System.out.println("采用file.transferTo的运行时间:" + (endTime - startTime) + "ms");
return "success";
}
/**
* 第三种方式
* 使用Spring MVC 提供的的类的方法上传文件
* postman:
* POST http://localhost:9090/changyong/upload/springUpload
* Body选择form-data, 选择要上传的文件,参数名为file,其实这里不需要
*
* @param request
* @return
* @throws IllegalStateException
* @throws IOException
*/
@RequestMapping("springUpload")
public String springUpload(HttpServletRequest request) throws IllegalStateException, IOException {
long startTime = System.currentTimeMillis();
//目录不存在则创建
String uploadPath = "D:/javatest/springUpload/";
File directory = new File(uploadPath);
if (!directory.exists()) {
directory.mkdirs();
}
//-------------------------- 主体内容 -----------------------
//将当前上下文初始化给 CommonsMultipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
//检查form中是否有enctype="multipart/form-data"
if (multipartResolver.isMultipart(request)) {
//将request变成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//获取multiRequest中所有的文件名
Iterator iter = multiRequest.getFileNames();
while (iter.hasNext()) {
//一次遍历所有文件
MultipartFile file = multiRequest.getFile(iter.next().toString()); //iter.next().toString()是请求的参数名
if (file != null) {
String path = uploadPath + file.getOriginalFilename();
//上传
file.transferTo(new File(path));
}
}
}
//-------------------------- 主体内容 -----------------------
long endTime = System.currentTimeMillis();
System.out.println("Spring方法的运行时间:" + (endTime - startTime) + "ms");
return "success";
}
}
其中,使用springMVC原生上传文件方法,需要一些简单的配置:
1)额外添加commons-fileupload依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
2)设置文件大小
/**
* 使用spring MVC原生上传文件方法,需要一些简单的配置
* 需要引入 commons-fileupload
* @return
*/
@Bean
public CommonsMultipartResolver uploadCommonsMultipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setDefaultEncoding("utf-8");
//文件大小最大值
multipartResolver.setMaxUploadSize(10485760000L);
//内存中的最大值
multipartResolver.setMaxInMemorySize(40960);
return multipartResolver;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!