当前位置: 首页 > news >正文

[第二章—Spring MVC的高级技术] 2.2 置multipart解析器

使用Servlet 3.0解析multipart请求

兼容Servlet 3.0的StandardServletMultipartResolver没有构 造器参数,也没有要设置的属性。


这样,在Spring应用上下文中,将 其声明为bean就会非常简单,如下所示:


file

● 既然这个@Bean方法如此简单,你可能就会怀疑。

  ○ 我们到底该如何限制StandardServletMultipartResolver的工作方式呢。○ 如果我们想要限制用户上传文件的大小,该怎么实现?○ 如果我们想要指定文件在上传时临时写入目录的位置,又该如何实现?

因为没有属性和构造器参数,StandardServletMultipartResolver的功能看起来似乎有些受限。


实际上,并不是这样,我们是有办法配置StandardServletMultipartResolver的限制条件的。


具体来说,我们必须要在web.xml或Servlet初始化类中将multipart的具体细节作为DispatcherServlet配置的一部分。

如果我们采用Servlet初始化类的方式来配置DispatcherServlet,这个初始化类应该已经实现了WebApplicationInitializer。那么我们可以在Servlet registration上调用setMultipartConfig()方法,传入一个MultipartConfigElement实例。 以下是最基本的DispatcherServlet multipart配置,它将临时路径设置为"/tmp/spittr/uploads":

<init-param><param-name>multipart-config-location</param-name><param-value>/tmp/spittr/uploads</param-value>
</init-param>
 DispatcherServlet ds = new DispatcherServlet();ServletRegistration.Dynamic registration = servletContext.addServlet("appServlet", ds);registration.addMapping("/");
registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads"));

如果我们配置DispatcherServlet的Servlet初始化类继承了两个类。

● AbstractAnnotationConfigDispatcherServletInitializer
● AbstractDispatcher-ServletInitializer
·```那么我们不会直接创建DispatcherServlet实例并将其注册到Servlet上下文中。这样的话,将不会有对Dynamic Servletregistration的引用供我们使用了。
***
但是,我们可以通过重载customizeRegistration () 方法 (它会得到一个Dynamic作为参数) 来配置multipart的具体细节:
```java
protected void customizeRegistration(Dyamic  registration){registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads"));
}

到目前为止,我们所使用的是只有一个参数的MultipartConfigElement构造器,这个参数指定的是文件系统中的一个绝对目录,上传文件将会临时写入该目录中。

在上传的过程中,如果文件大小达到了一个指定的最大容量(以字节为单位),将会写入到临时文件路径中。默认值为0,也就是所有上传的文件都会写入到磁盘上。


例如,假设我们想要限制文件的大小不超过2MB,整个请求不超过4MB,而且所有的文件都要写到磁盘中。 下面的代码使用MultipartConfigElement设置了这些临界值:

MultipartConfigElement multipartConfig = new MultipartConfigElement("/tmp/spittr/uploads", 2097152, 4194304, 0);@override
protected void customizeRegistration(Dynamic regisation){registration.setMultpartConfig(new MultipartConfigElement("/tmp/spittr/uploads",2097152,4194304,0));
}

如果我们使用更为传统的web.xml来配置MultipartConfigElement的话,那么可以使用 中 的 元素,如下所示: 的默认值与MultipartConfigElement相 同。与MultipartConfigElement一样,必须要配置的是 。


配置Jakarta Commons FileUpload multipart解析器

1. 介绍StandardServletMultipartResolver是一个不错的选择。
2. 如果需要在非Servlet 3.0的容器中部署应用,则需要替代方案。
3. 可以编写自己的MultipartResolver实现,但除非需要执行特定逻辑,否则没有必要这样做。
4. Spring内置了CommonsMultipartResolver,可以作为StandardServletMultipartResolver的替代方案

将CommonsMultipartResolver声明为Spring bean的最简单方式如下:

@Bean
public CommonsMultipartResolver multipartResolver() {CommonsMultipartResolver resolver = new CommonsMultipartResolver();// 设置解析器的相关属性resolver.setMaxUploadSize(5242880); // 5MBresolver.setMaxInMemorySize(4096); // 4KBreturn resolver;
}

与StandardServletMultipartResolver有所不同,CommonsMultipart-Resolver不会强制要求设置临时文件路 径。默认情况下,这个路径就是Servlet容器的临时目录。 @Bean public MultipartResolver multipartResolver(){ retrun new CommonsMultpartResolver(); } 通过 设置uploadTempDir属性,我们可以将其指定为一个不同的位置:

@Bean
public MultipartAReslover multpartReslover() throws  IOException{CommonsMultipartReslover multiparReslover = new CommonsMultipartReslover();multipartReslover.setUploadTempDir(new fileSystemResources("/tmp/spittr/uploads"));return multipartResolver;
}

实际上,我们可以按照相同的方式指定其他的multipart上传细节,也 就是设置CommonsMultipartResolver的属性。 例如,如下的配 置就等价于我们在前文通过MultipartConfigElement所配置的 StandardServletMultipartResolver:

@Bean
public MultipartAReslover multpartReslover() throws  IOException{CommonsMultipartReslover multiparReslover = new CommonsMultipartReslover();multipartReslover.setUploadTempDir(new fileSystemResources("/tmp/spittr/uploads"));multipartReslover.setMaxUploadSize(2097152);multipartReslover.serMaxInMemorySize(0);return multipartResolver;
}

在这里,我们将最大的文件容量设置为2MB,最大的内存大小设置为 0字节。这两个属性直接对应于MultipartConfigElement的第二 个和第四个构造器参数,表明不能上传超过2MB的文件,并且不管文 件的大小如何,所有的文件都会写到磁盘中。 但是与MultipartConfigElement有所不同,我们无法设定multipart请 求整体的最大容量。

本文由博客一文多发平台 OpenWrite 发布!

相关文章:

  • 21 移动网络的前世今生
  • Sa-Token拦截全部接口必须登录-然后自定义注解来匿名登录-作为权限框架支持,并且同时使用了注解和路由的拦截器模式,此部分的配置如下:
  • 虚拟机复制后,无法ping通问题解决
  • Flutter——最详细(AppBar)使用教程
  • 【Linux精讲系列】——vim详解
  • 【Linux】:git基本操作_添加文件_两种场景_查看.git文件 || git修改文件 || 版本回退
  • arima模型python代码
  • 网际报文协议ICMP及ICMP重定向实例详解
  • 数据结构—字符串
  • APISpace IP归属地查询接口案例代码
  • 【网络协议】聊聊HTTPDNS如何工作的
  • Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集
  • 开放智慧,助力学习——电大搜题,打开学无止境的新篇章
  • 使用IDEA让文本对比不在变的困难
  • R语言生物群落(生态)数据统计分析与绘图
  • ECMAScript入门(七)--Module语法
  • extract-text-webpack-plugin用法
  • hadoop集群管理系统搭建规划说明
  • Java多态
  • leetcode388. Longest Absolute File Path
  • LeetCode算法系列_0891_子序列宽度之和
  • Python 反序列化安全问题(二)
  • react 代码优化(一) ——事件处理
  • Sublime text 3 3103 注册码
  • vue的全局变量和全局拦截请求器
  • Wamp集成环境 添加PHP的新版本
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • k8s使用glusterfs实现动态持久化存储
  • #vue3 实现前端下载excel文件模板功能
  • (04)odoo视图操作
  • (阿里云万网)-域名注册购买实名流程
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)丶RabbitMQ的六大核心
  • (十六)串口UART
  • (转)Oracle存储过程编写经验和优化措施
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET 发展历程
  • .net 简单实现MD5
  • .Net(C#)自定义WinForm控件之小结篇
  • .net开发时的诡异问题,button的onclick事件无效
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [1204 寻找子串位置] 解题报告
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [Excel] vlookup函数
  • [iOS]中字体样式设置 API
  • [JS]变量
  • [Linux]文件基础-如何管理文件
  • [Real world Haskell] 中文翻译:第一章 快速上手
  • [sd_scripts]之train
  • [Spring Data MongoDB]学习笔记--MongoTemplate插入修改操作
  • [Spring] Spring Boot 生态
  • [Ubuntu 20.04] 使用Netplan配置网络静态IP
  • [Vue]路由传参 命名路由