目录
- 配置 StandardServletMultipartResolver 解析器
- 配置 CommonsMultipartResolver 解析器
- 上传文件、处理文件
- 总结
multipart
格式的数据 会将 一个表单拆分为 多个部分,每个部分对应一个输入域。
在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制。
配置 multipart 解析器:
有两个:
CommonsMultipartResolver
:使用 Jakarta Commons FileUpload 解析 multiparty。StandardServletMultipartResolver
:依赖于 Servlet 3.0 对 multipart 请求的支持。
配置 StandardServletMultipartResolver 解析器
1、在ApplicationContext 中声明为 bean:
@Bean public MultipartResolver multipartResolver(){ return new StandardServletMultipartResolver(); }
2、在 web.XML 或 Servlet 初始化类中,配置 multipart 的具体细节,如:文件大写,临时文件路径等。
- 如果已经实现了 WebApplicationInitializer 接口,可以在Servlet registration 上调用
setMultipartConfig()
方法进行配置:
@Override public void onStartup(ServletContext servletContext) throws ServletException { DispatcherServlet dispatcherServlet = new DispatcherServlet(); ServletRegistration.Dynamic registration = servletContext.addServlet("appServlet", dispatcherServlet); registration.addMapping("/"); registration.setMultipartConfig(new Multip编程客栈artConfigElement("/tmp/uploads")); }
- 若 初始化 类 继承了
AbstractAnnotationConfigDispatcherServletInitializer
或AbstractDispatcherServletInitializer
通过重写customizeRegistration
方法 来配置multipart
的具体细节
@Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { registration.setMultipartConfig( new MultipartConfigElement("/tmp/test/uploads") ); }
了解 MultipartConfigElement 类:
new MultipartConfigElement("/tmp/test/uploads",2097152,4194304,0)
- 指定 临时存放目录 为
/tmp/test/uploads
。 - 上传文件的最大容量:
2097152
= 2MB。 - 整个 multipart 请求的最大容量
4194304
= 4MB。 - 文件大写 达到一定容量,会写入 临时文件路径中,默认是 0,所有上传的文件都会写入磁盘中。
对应 在 web.xml 中的配置:
<servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> <multipart-config> <!-- 临时路劲 --> <location>/tmp/test/uploads</location> <!-- 上传文件的最大值 --> <max-file-size>2097152</max-file-size> <!--请求的最大容量--> <max-request-size>4194304</max-request-size> </multippythonart-config> </servlet>
配置 CommonsMultipartResolver 解析器
声明为 bean
@Bean public MultipartResolver multipartResolver(){ return new CommonsMultipartResolver(); }
文件大小,临时路径等在 声明Bean 时设置。
@Bean public MultipartResolver multijavascriptpartResolver() throws IOException { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); // 设置 临时目录 multipartResolver.setUploadTempDir(new FileSystemResource("/tmp/test/uploads")); // 最大文件 multipartResolver.setMaxUploadSize(2097152); multipartResolver.setMaxInMemorySize(0); return multipartResolver; }
上传文件、处理文件
表单的大体样式:
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="picture" accept="image/jpeg"> <input type="submit" value="提交"> </form>
enctype="multipart/form-data"
告诉 浏览器以 multipart 数据的形式提交表单。accept="image/jpeg"
限制文件接收的类型 为 JPEG。
Controller 上接收上传的文件
@RequestMapping("/upload") public String uploadImage(@RequestPart("picture")Multihttp://www.devze.compartFile file) throws IOException { // 获取 文件 名 String filename = file.getOriginalFilename(); // 将 上传的文件 写入到 文件系统中 file.transferTo(new File("/data/image"+filename)); return "index"; }
- MultipartFile 接口,为处理 multipart 数据提供了内容更为丰富的对象。
public interface MultipartFile extends InputStreamSource { String getName(); @Nullable String getOriginalFilename(); @Nullable String getContentType(); boolean isEmpty(); long getSize(); byte[] getBytes() throws IOException; InputStream getInputStream() throws IOException; default Resource getResource() { bxbyyj return new MultipartFileResource(this); } void transferTo(File var1) throws IOException, IllegalStateException; default void transferTo(Path dest) throws IOException, IllegalStateException { FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest)); } }
可以把 MultipartFile 替换为 Servlet.http.Part
@RequestMapping("/upload") public String uploadImage(@RequestPart("picture") Part file) throws IOException { // 获取 文件 名 String filename = file.getSubmittedFileName(); // 将 上传的文件 写入到 文件系统中 file.write("/data/image"+filename); return "index"; }
通过 Part 参数接收上传文件,那么没有必要 配置 MultipartResolver 了。只有使用 MultipartFile 的时候,才需要 配置。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论