项目代码: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. mybatis使用细节注意

    mybatis细节 增删改查ParameterType都可以不用写 解释这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数 mybatis 中 ...

  2. 从执行上下文角度重新理解.NET(Core)的多线程编程[1]:基于调用链的”参数”传递

    线程是操作系统能够进行运算调度的最小单位,操作系统线程进一步被封装成托管的Thread对象,手工创建并管理Thread对象已经成为了所能做到的对线程最细粒度的控制了.后来我们有了ThreadPool, ...

  3. Camtasia中对录制视频进行编辑——行为

    小视频的逐渐兴起,让我们的生活变得多姿多彩,同时,也造就了一批新媒体的创业者还有越来越多的网红,这不禁使我们也想加入他们的行列.但是问题来了,拍摄视频后最重要的是对视频进行剪辑,没有一款经济适用的软件 ...

  4. 详解FL Studio压缩器——Fruity Limiter(下)

    Hello!小伙伴们又见面啦-接上一篇,本篇咱们继续讲解音乐编曲软件FL Studio20压缩器内容. 包络"ENVELOPE"中包含三个旋钮,它们都有什么作用呢?一起来揭晓吧! ...

  5. Vegas视频的音频叠加效果怎么实现,可以用其他软件吗

    有时我们会用Vegas为某段影片配音,我们要怎么把配音和背景声融合在一起呢?想必马上会有人反应过来:让配音和背景声分别置于两条轨道上就好了.这当然是一个相当好的方式. 可是,如果我想要把两段音频合成一 ...

  6. spring中的事务传播机制

    1.事务的实现思想 在spring中要想某个方法具有事务,只要在方法前加一个@Transactional注解.然后spring就会利用aop思想,在这个方法执行前开启事务, 在方法执行后选择提交事务或 ...

  7. MarkDown学习总结-2020.05.11

    1.使用工具 1.1Typora 官网地址:https://www.typora.io/ 下载链接 2.基础入门 注意: []中的内容则是对应格式的标记符,默认全部标识符后面需要多加一个空格才能生效. ...

  8. 通过PHPExcel将Excel表文件中数据导入数据库

    1 <?php 2 header("Content-Type:text/html;charset=utf-8"); 3 include_once 'PHPExcel.php' ...

  9. Qt5字符串编码转换学习

    目录 1.通过Python3示例探索常用字符串编码 UTF8 ANSI Unicode 小结 2.Qt5中使用QTextCodec进行编码转换 小结 1.通过Python3示例探索常用字符串编码 下面 ...

  10. html基础标签用法

    head title 行级双 网页标题标签 meta 单 存放网页重要信息,字符集,搜索索引,简介等(不显示) a 标签行内双标签 href="跳转路径", (JavaScript ...