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

news2024/11/26 17:41:59

使用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); // 5MB
    resolver.setMaxInMemorySize(4096); // 4KB
    return 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 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1178999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计java+vue+springboot的论坛信息网站

项目介绍 本论文系统地描绘了整个网上论坛管理系统的设计与实现&#xff0c;主要实现的功能有以下几点&#xff1a;管理员&#xff1b;首页、个人中心、用户管理、公告管理、公告类型管理、热门帖子管理、帖子分类管理、留言板管理、论坛新天地、我的收藏管理、系统管理&#…

[C/C++]数据结构 链表OJ题: 反转链表

描述: 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 示例: 方法一: 让链表指向反向 如图所示: 代码思路: struct ListNode* reverseList(struct ListNode* head) {struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode*…

webgoat-Broken Access ControlI 访问控制失效

Insecure Direct Object References 直接对象引用 直接对象引用是指应用程序使用客户端提供的输入来访问数据和对象。 例子 使用 GET 方法的直接对象引用示例可能如下所示 https://some.company.tld/dor?id12345 https://some.company.tld/images?img12345 https://some.…

【C++】map set

map & set 一、关联式容器二、键值对三、树形结构的关联式容器1. set&#xff08;1&#xff09;set 的介绍&#xff08;2&#xff09;set 的使用 2. multiset3. map&#xff08;1&#xff09;map 的介绍&#xff08;2&#xff09;map 的使用 4. multimap 四、map 和 set 的…

零基础编程入门教程软件推荐,零基础编程自学

零基础编程入门教程软件推荐&#xff0c;零基础编程自学 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;象如图这个实例就是用…

freertos多任务

以前我们都是一个任务&#xff0c;假设现在我们创建三个任务,项目工程在上一节网盘 #include "stm32f10x.h" // Device header #include "freertos.h" #include "task.h" #include "usart.h"TaskHandle_t myTaskHan…

什么是商业?什么是企业?什么又是竞争呢?

博主从商了&#xff0c;读了一些关于商业企业跟竞争的关系的书跟文章&#xff0c;突然就有点感受想分享一下&#xff0c;请诸位佬讨论一下&#xff0c;听取一下各位佬的意见&#xff0c;学习一下各位的宝贵经验。 百度百科是这样解释商业企业跟竞争的 商业是以买卖方式使商品流…

Java中的垃圾回收机制

Java中的垃圾回收机制 一、Java垃圾回收机制面试题二、哪些对象应该被回收三、什么时候进行垃圾回收四、怎么清除垃圾对象4.1 标记-清除算法4.2 复制算法4.3 整理算法4.4 分代收集算法&#xff08;主流&#xff09;4.4.1 新生代4.4.2 老年代4.4.3 永久代 五、垃圾收集器六、注意…

zotero跨Windows设备数据同步(利用OneDrive、百度云同步空间等云服务)

zotero跨Windows设备数据同步&#xff08;利用OneDrive、百度云同步空间等云服务&#xff09; 特别注意 不能在多个设备同步使用zotero&#xff0c;否则会导致同步出现异常。 基本原理 同步zotero的数据&#xff0c;即同步全部的文献和笔记、高亮标记信息。而这两类数据分别…

JPCC:燃料电池中用于高效氧还原阴极的拓扑铋(1ī0)面

质子交换膜燃料电池的性能在很大程度上取决于电化学氧还原反应&#xff08;ORR&#xff09;的效率。在这里&#xff0c;宾夕法尼亚大学Andrew M. Rappe等人报道了二维&#xff08;4单层&#xff0c;ML&#xff09;和三维Bi&#xff08;16ML&#xff09;&#xff08;1ī0&#x…

从零开始搭建React+TypeScript+webpack开发环境-使用iconfont构建图标库

创建iconfont项目 进入iconfont官网&#xff0c;完成注册流程&#xff0c;即可创建项目。 无法访问iconfont可尝试将电脑dns改为阿里云镜像223.5.5.5和223.6.6.6 添加图标 在图标库里选择图标&#xff0c;加入购物车 将图标添加到之前创建的项目中 生成代码 将代码配置到项目…

noip模拟赛多校第八场 T3 遥控机器人 (最短路 + 技巧拆点)

题面 简要题意&#xff1a; 给你一个 n n n 个点 m m m 条边的图。边 i i i 有颜色 c i c_i ci​。你可以选择一些边改变它们的颜色成为区间 [ 1 , m ] [1, m] [1,m] 中的任意颜色&#xff0c;改变一条边 i i i 一次的代价是 w i w_i wi​。询问你能否在一些改变…

使用SSH ,让windows和linux互通

简介 SSH 是一种安全网络协议&#xff0c;旨在让客户端和服务器之间进行安全的数据传输。SSH 的核心思想是利用公钥加密技术和共享密钥加密技术相结合的方式&#xff0c;使客户端和服务器之间建立起安全的连接。 当客户端发起连接请求时&#xff0c;服务器会对客户端进行身份验…

python的format函数的用法及实例

目录 1.format函数的语法及用法 &#xff08;1&#xff09;语法&#xff1a;{}.format() &#xff08;2&#xff09;用法&#xff1a;用于格式化字符串。可以接受无限个参数&#xff0c;可以指定顺序。返回结果为字符串。 2.实例 &#xff08;1&#xff09;不设置位置&…

RK3568平台开发系列讲解(音视频篇)RTMP 推流

🚀返回专栏总目录 文章目录 一、RTMP 的工作原理二、RTMP 流媒体服务框架2.1、Nginx 流媒体服务器2.2、FFmpeg 推流沉淀、分享、成长,让自己和他人都能有所收获!😄 📢目前常见的视频监控和视频直播都是使用了 RTMP、RTSP、HLS、MPEG-DASH、 WebRTC流媒体传输协议等。 R…

学习Opencv(蝴蝶书/C++)相关——2.用clang++或g++命令行编译程序

文章目录 1. c/cpp程序的执行1.1 cpp程序的编译过程1.2 预处理指令1.3 编译过程的细节2. macOS下使用Clang看cpp程序的编译过程2.1 示例2.1.1 第一步 预处理器-preprocessor2.1.2 第二步 编译器-compiler2.1.3 第三步 汇编器-assembler2.1.4 第四步 链接器-linker2.1.5 链接其他…

git commit规范提交

Git每次提交代码时&#xff0c;都要写Commit Message&#xff08;提交说明&#xff09;&#xff0c;通常情况下&#xff0c;Commit Message应该清晰明了&#xff0c;说明本次提交的目的和具体操作等。然而笔者工作多年来发现&#xff0c;有些公司对Commit Message没有明确的要求…

10 索引优化与查询优化

文章目录 索引失效案例关联查询优化对于左外连接对于内连接JOIN语句原理简单嵌套循环连接SNLJ索引嵌套循环连接INLJ块嵌套循环连接BNLJHash Join 子查询优化排序优化filesort算法&#xff1a;双路排序和单路排序 分组优化分页优化优先考虑覆盖索引索引下推ICP使用条件 其他查询…

[移动通讯]【Carrier Aggregation-13】【Carrier Aggregation】

前言&#xff1a; 前面分享过不同note CA 技术文档 这里主要参考 4G|ShareTechnote 《Carrier Aggregation》 CA SCell 添加的小区的流程&#xff1a; SCell addition and removal&#xff1a; 1 The carrier aggregation additional SCells cannot be activated immediately…

Firefox 119 正式发布

Firefox 119 已正式发布。新版本除了修复 Bug 之外&#xff0c;还增强了 Firefox View 功能、支持在 PDF 文档中插入图片&#xff0c;以及引入 Encrypted Client Hello (ECH) 以增强隐私保护等。 主要变化 改进 Firefox View&#xff1a;用户可以在该页面查看所有窗口打开的标…