SpringMVC中使用CommonsMultipartResolver进行文件上传
概述:
CommonsMultipartResolver是基于Apache的Commons FileUpload来实现文件上传功能的。所以在项目中需要相应的jar文件。
FileUpload版本要求1.2及以上。相应的gradle配置:
"commons-fileupload:commons-fileupload:1.2.2"
- 1
上传方法的实现
1. 代码方式
直接在controler中new一个CommonsMultipartResolver。
@Controller
@RequestMapping(value = "/file")
public class FileController {
@RequestMapping(value = "/commUploadA")
@ResponseBody
public JSONObject commUploadA(HttpServletRequest request) {
JSONObject json = new JSONObject();
json.put("succ", false);
try {
//直接new一个CommonsMultipartResolver
CommonsMultipartResolver cmr = new CommonsMultipartResolver(request.getServletContext());
cmr.setDefaultEncoding("utf-8");
cmr.setMaxInMemorySize(40960);
cmr.setMaxUploadSize(10485760000L);
if (cmr.isMultipart(request)) {
MultipartHttpServletRequest multipartRequest = cmr.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("uploadFile");// 与页面input的name相同
File imageFile = new File("d:/upload1.jpg");// 上传后的文件保存目录及名字
file.transferTo(imageFile);// 将上传文件保存到相应位置
json.put("succ", true);
return json;
}
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
}
2. Xml方式
通过spring配置一个名为”multipartResolver”的bean。
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>
controller中的方法做相应修改。
@Controller
@RequestMapping(value = "/file")
public class FileController {
@RequestMapping(value = "/commUploadB")
@ResponseBody
public JSONObject commUploadB(MultipartHttpServletRequest request) {//参数类型不同
JSONObject json = new JSONObject();
json.put("succ", false);
try {
MultipartFile file = request.getFile("uploadFile");// 与页面input的name相同
File imageFile = new File("d:/upload2.jpg");// 上传后的文件保存目录及名字
file.transferTo(imageFile);// 将上传文件保存到相应位置
json.put("succ", true);
return json;
} catch (Exception e) {
e.printStackTrace();
return json;
}
}
}
两种方法的区别:
- 将CommonsMultipartResolver的实例化由代码实现改为了xml配置实现。
- 方法中的参数类型由HttpServletRequest变为了MultipartHttpServletRequest。
而上传的获取和保存逻辑没有变化。
注意:
在使用xml方式时,bean的名字必须为:multipartResolver。可在org.springframework.web.servlet.DispatcherServlet中找到原因:
public class DispatcherServlet extends FrameworkServlet {
/** Well-known name for the MultipartResolver object in the bean factory for this namespace. */
public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
......
/**
* Initialize the MultipartResolver used by this class.
* <p>If no bean is defined with the given name in the BeanFactory for this namespace,
* no multipart handling is provided.
*/
private void initMultipartResolver(ApplicationContext context) {
try {
this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class);
if (logger.isDebugEnabled()) {
logger.debug("Using MultipartResolver [" + this.multipartResolver + "]");
}
}
catch (NoSuchBeanDefinitionException ex) {
// Default is no multipart resolver.
this.multipartResolver = null;
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate MultipartResolver with name '" + MULTIPART_RESOLVER_BEAN_NAME +
"': no multipart request handling provided");
}
}
}
......
}
简要分析CommonsMultipartResolver
CommonsMultipartResolver实现接口org.springframework.web.multipart.MultipartResolver,主要作用是将HttpSerlvetRequest封装成MultipartHttpServletRequest。
public interface MultipartResolver {
......
MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;
......
}
具体的封装方法参考CommonsMultipartResolver对resolveMultipart的实现:
org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(javax.servlet.http.Ht
SpringMVC中使用CommonsMultipartResolver进行文件上传的更多相关文章
- 分享知识-快乐自己:SpringMvc中的单多文件上传及文件下载
摘要:SpringMvc中的单多文件上传及文件下载:(以下是核心代码(拿过去直接能用)不谢) <!--设置文件上传需要的jar--> <dependency> <grou ...
- SpringMVC中使用 MultipartFile 进行文件上传下载及删除
一:引入必要的包 <!--文件上传--> <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fil ...
- Spring中使用StandardServletMultipartResolver进行文件上传
从Spring3.1开始,Spring提供了两个MultipartResolver的实现用于处理multipart请求,分别是:CommonsMultipartResolver和StandardSer ...
- SpringMVC(四)-- springmvc的系统学习之文件上传、ajax&json处理
资源:尚学堂 邹波 springmvc框架视频 一.文件上传 1.步骤: (1)导入jar包 commons-fileupload,commons-io (2)在springmvc的配置文件中配置解析 ...
- zt对于C#中的FileUpload解决文件上传大小限制的问题设置
对于C#中的FileUpload解决文件上传大小限制的问题设置 您可能没意识到,但对于可以使用该技术上载的文件的大小存在限制.默认情况下,使用 FileUpload 控件上载到服务器的文件最大为 4M ...
- SpringMVC(三)-- 视图和视图解析器、数据格式化标签、数据类型转换、SpringMVC处理JSON数据、文件上传
1.视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象 对于那些返回 String,View 或 ModeMap 等类型的处理方法,SpringMVC 也会在内部将 ...
- springMVC数据校验与单文件上传
spring表单标签: <fr:from/> 渲染表单元素 <fr:input/>输入框组件 <fr:password/>密码框组件标签 & ...
- SpringMVC ajax技术无刷新文件上传下载删除示例
参考 Spring MVC中上传文件实例 SpringMVC结合ajaxfileupload.js实现ajax无刷新文件上传 Spring MVC 文件上传下载 (FileOperateUtil.ja ...
- SpringMVC(三) RESTful架构和文件上传下载
RESTful架构 REST全名为:Representational State Transfer.资源表现层状态转化.是目前最流行的一种互联网软件架构. 它结构清晰.符合标准.易于理解.扩展方便,所 ...
随机推荐
- 【反演复习计划】【51nod1594】Gcd and Phi
现在感觉反演好多都是套路QAQ…… #include<bits/stdc++.h> using namespace std; ; typedef long long ll; int n,c ...
- pythn抓取网页小例子
import urllib.request import re from tkinter import * win = Tk() win.geometry('500x300+400+300') t = ...
- pytest学习(1)
pytest是python的一个测试框架,主要是用来进行一些小的测试. 在pycharm中,缺省用的是unittest,这里说明如何设置为pytest. 当然,第一部是安装pytest pip3 in ...
- 根据流程实例ID获取当前任务
JAVA: Task task = this.processEngine.getTaskService().createTaskQuery().processInstanceId(“132501”). ...
- 安装配置GitLab
在 CentOS 6 安装 使用国内镜像安装,新建 /etc/yum.repos.d/gitlab-ce.repo,添加以下内容 [gitlab-ce] name=gitlab-ce baseurl= ...
- 欧拉图和欧拉圈-Play On Words(UVa10129)
欧拉路和欧拉圈,简言之就是,从无向图的一个结点出发,走一条路/圈,每条边恰好经过一次,即一笔画问题 欧拉定理:一个无向图最多只有两个奇结点,那么我们就从一个奇结点出发,到另一个结点为之,一定有一条欧拉 ...
- LCIS最长公共上升子序列
最长公共上升子序列LCIS,如字面意思,就是在对于两个数列A和B的最长的单调递增的公共子序列. 这道题目是LCS和LIS的综合. 在LIS中,我们通过两重循环枚举当序列以当前位置为结尾时,A序列中当前 ...
- Codeforces #442 Div2 E
#442 Div2 E 题意 给你一棵树,每个结点有开关(0表示关闭,1表示开启),两种操作: 反转一棵子树所有开关 询问一棵子树有多少开关是开着的 分析 先 DFS 把树上的结点映射到区间上,然后就 ...
- C++ 对象的内存布局【转】
单一继承: 虚函数表在最前面的位置. 成员变量根据其继承和声明顺序依次放在后面. 在单一的继承中,被overwrite的虚函数在虚函数表中得到了更新. 多重继承 每个父类都有自己的虚表. 子类的成员函 ...
- [Luogu P4198]楼房重建(线段树)
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...