项目代码:https://github.com/PeiranZhang/springmvc-fileupload

Servlet3.0之前使用文件上传功能

Servlet3.0之前需要使用commons file upload和commons io组件,依赖一下了两个jar

  • commons-fileupload-1.3.jar
  • commons-io-2.4.jar

spring配置文件中配置bean

    <!--Servlet 3.0之前,需要定义CommonsMultipartResolver来支持文件上传功能,bean id固定为"multipartResolver"-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--定义上传文件最大为1KB-->
<property name="maxUploadSize" value="1000000"/>
<property name="uploadTempDir" value="file:E://tmp"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>

文件上传jsp编写

下面代码中,指定了enctype,同时使用了多个文件上传,name="files"。另外,form表单中也可以使用其他的文本框。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<!--需要指定enctype="multipart/form-data",才能使用文件上传功能-->
<form action="save_file" method="post" enctype="multipart/form-data" >
<table>
<tr>
<td>Select a file to upload</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td>Select a file to upload</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td>Name</td>
<td><input type="text" name="name" /></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
</form>
</body>
</html

Contorller处理代码

@Controller
public class UploadFileController {
@RequestMapping(value = "/upload_file")
public String uploadFile(){
return "uploadFile";
} @RequestMapping(value = "/save_file")
/**
* 多个文件上传,对应需要MultipartFile[]数组,否则不需要数组
*/
public String saveFile(@RequestParam("files")MultipartFile[] files,
@RequestParam("name") String name,
HttpServletRequest request,Model model){
//保存文件
if(files != null && files.length > 0){
for(MultipartFile file : files){
String fileName = file.getOriginalFilename();
String dir = "E://test";
File saveFile = new File(dir,fileName);
try {
//文件保存到本地
file.transferTo(saveFile);
}catch (Exception e){
e.printStackTrace();
}
}
}
//显示添加请求对象,在fileLists.jsp重可以使用EL表达式访问对象,即${files}
request.setAttribute("files",files);
request.setAttribute("name",name);
//也可以不添加对象,在fileLists.jsp总可以直接使用EL隐式对象param来访问,即${param.email}来访问
//request.setAttribute("email",email); //使用Model添加,为啥在jsp中访问不到?
//model.addAttribute(files);
//model.addAttribute(name);
return "fileLists";
}
}

Controller中处理方法使用@RequestParam注解接受请求中的参数,传递给处理方法参数,使用MultipartFile数组参数接收上传的文件。另外,可以通过在参数中定义HttpServletRequest对象来获得原始的请求对象,然后调用request.setAttribute方法设置视图对象,在返回的jsp视图中通过EL表达式引用这些对象,EL表达式中提供了一些隐式对象,例如param,这是一个包含所有请求参数,并用参数名作为key的Map,通过param隐式对象,可以直接访问某一个请求参数。具体访问方式见代码中注解部分。

fileLists.jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
<head>
<title>File List</title>
</head>
<body>
<table>
<tr>
<td>Name:</td>
<td>${name}</td>
</tr>
<tr>
<td>Email</td>
<td>${param.email}</td>
</tr>
<c:forEach items="${files}" var="file">
<tr>
<td>OriginalFileName:</td>
<td>${file.originalFilename}</td>
</tr>
<tr>
<td>Type:</td>
<td>${file.contentType}</td>
</tr>
</c:forEach>
</table>
</body>
</html>

fileLists.jsp中通过EL表达式来访问对象,包含param隐式对象和controller中添加的files对象,该对象为MultipartFile数组

Servlet3.0及3.0之后使用文件上传功能

有了Servlet 3.0,就不需要Commons FileUpload和Commons IO元件了。在Servlet 3.0及其以上版本的容器中进行服务器端文件上传的编程,是围绕着注解类型MultipartConfig和javax. servlet.http.Part接口进行的。处理已上传文件的Servlets必须以@MultipartConfig进行注解。Spring MVC的DispatcherServlet处理大部分或者所有请求。如果不修改源代码,将无法对Servlet进行注解。但值得庆幸的是,Servlet 3.0中有一种比较容易的方法,能使一个Servlet变成一个MultipartConfig Servlet,即给部署描述符(web.xml)中的Servlet声明赋值。在web.xml中添加multipart-config标签与用@MultipartConfig给DispatcherServlet进行注解的效果一样。

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation配置springmvc加载的配置文件适配器、处理映射器等-->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/springmvc-config.xml</param-value>
</init-param>
<!--值不为0表示,tomcat启动该应用时,加载servlet,而不是等到第一请求到来时再加载servlet-->
<load-on-startup>1</load-on-startup>
<multipart-config>
<!--临时目录,需要目录存在,否则报错-->
<location>E:\\tmp</location>
<max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request-size>
<!--上传文件超出这个容量界限时,会被写入磁盘。-->
<file-size-threshold>1048576</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 所有访问都由DispatcherServlet进行解析-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

spring配置文件中,配置multipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>

结果

参考

springmvc中使用文件上传功能的更多相关文章

  1. (转)SpringMVC学习(九)——SpringMVC中实现文件上传

    http://blog.csdn.net/yerenyuan_pku/article/details/72511975 这一篇博文主要来总结下SpringMVC中实现文件上传的步骤.但这里我只讲单个文 ...

  2. 【SpringMVC学习08】SpringMVC中实现文件上传

    之前有写过一篇struts2实现的文件上传,这一篇博文主要来总结下springmvc实现文件上传的步骤.首先来看一下单个文件的上传,然后再来总结下多个文件上传. 1. 环境准备 springmvc上传 ...

  3. 再springMVC中自定义文件上传处理解决与原spring中MultipartResolve冲突问题

    相信很多朋友再用springmvc时都遇见了一个问题,那就是自带的获取上传的东西太慢,而且不知道如何修改,其实不然,spring框架既然给我们开放了这个接口,就一定遵从了可扩展性的原则,经过查看org ...

  4. SpringMVC高速实现文件上传功能

    SpringMVC为我们封装了上传文件的功能,如今就试用一下 须要的jar包 我用的是Maven项目,就不须要到处下载Jar包了 SpringMVC的搭建 首先要在applicationContext ...

  5. SpringMVC中的文件上传

    1. 配置图片服务器 一般图片会单独保存在图片服务器上, 本文为简化处理, 在Tomcat中配置一个路劲用于专门存放图片 在tomcat上配置图片虚拟目录,在tomcat下conf/server.xm ...

  6. 案例52-crm练习新增客户中加入文件上传功能(struts2文件上传)

    1 jsp/customer/add.jsp 完整代码: <%@ page language="java" contentType="text/html; char ...

  7. flask完成文件上传功能

    在使用flask定义路由完成文件上传时,定义upload视图函数 from flask import Flask, render_template from werkzeug.utils import ...

  8. Spring +SpringMVC 实现文件上传功能。。。

    要实现Spring +SpringMVC  实现文件上传功能. 第一步:下载 第二步: 新建一个web项目导入Spring 和SpringMVC的jar包(在MyEclipse里有自动生成spring ...

  9. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...

随机推荐

  1. 新鲜出炉!凭借着这份面试宝典,我终于拿下了字节跳动的offer!

    前言 我做Java也十来年了,现在也算是中层管理,每次招聘都需要找一些面试题,干脆自己整理了一份,这份面试宝典是从我 去年开始收集的,一方面是给公司招聘用,另一方面也是想用它,来挖掘自己在 Java ...

  2. leetcode165. 比较版本号

    比较两个版本号 version1 和 version2.如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0 ...

  3. PHP获取数组中重复值的键值

    $array = array ( 0=>'a', 1=>'b', 2=>'a', 5=>'b', 6=>'c', 40=>'d' ); $keyarr =[];$r ...

  4. iOS图文混排的几种方式

    最近优化升级了之前做的一个项目,现在这一期已接近尾声了,今天可以腾出些时间总结一下最近项目中用的比较多的图片文字混排显示的内容.现在遇到比较多的图文混排的基本有三种:一种是在标签中显示 价格符号+价格 ...

  5. Java基础教程——注释

    Java注释 三种注释: public class 注释 { // (1)单行注释 /* * (2)多行注释 */ /**+回车 * (3)文档注释:可以通过javadoc工具生成HTML文档 * & ...

  6. 题解 洛谷 P2612 【[ZJOI2012]波浪】DP+高精

    题目描述 题目传送门 分析 因为有绝对值不好处理,所以我们强制从小到大填数 设 \(f[i][j][p][o]\) 为当前填到了第 \(i\) 个数,波动强度为 \(j\),有 \(p\) 个连续段并 ...

  7. Foreground-aware Image Inpainting

    引言 语义分割得到边缘信息指导修复其三 存在问题:现在的图像修复方法主要的通过周围像素来修复,当修复区域与前景区域(显著物体)有交叠时,由于修复区域缺失前景与背景的时间内容导致修复结果不理想. 提出方 ...

  8. Clickhouse 入门

    clickhouse 简介 ck是一个列式存储的数据库,其针对的场景是OLAP.OLAP的特点是: 数据不经常写,即便写也是批量写.不像OLTP是一条一条写 大多数是读请求 查询并发较少,不适合放置先 ...

  9. (转)React学习笔记(干货满满)

    1. React 长什么样 React 是 facebook 开源出来的一套前端方案,官网在 https://reactjs.org . 先看一个简单的样子: <!DOCTYPE html> ...

  10. 【常见踩坑】】USB调试安装失败(Installation failed with message INSTALL_CANCELED_BY_USER)

    [参考]http://www.cnblogs.com/liushilin/p/6553918.html 问题:在USB安装调试(小米手机),出现如下错误 解决:1.小米手机解决办法见参考.登录小米账号 ...