SpringMVC文件上传

来源:互联网 发布:数据站点应当互不相同 编辑:程序博客网 时间:2024/05/18 22:11

1.1 文件上传

文件上传要求表单满足三个条件:

l  提交方式为:POST

l  添加一个属性enctype,其值为multipart/form-data

l  至少具有一个file表单元素

 

文件上传一般都要使用apache提供的文件上传工具类,所以我们要导入两个Jar包:

l  文件上传核心Jar包

l  文件上传所依赖的IO Jar包

(1)       环境搭建

A、 导入JAR包

Spring MVC 基础jar包

Apache文件上传的jar包

com.springsource.org.apache.commons.fileupload-1.2.0.jar

com.springsource.org.apache.commons.io-1.4.0.jar

B、 文件上传表单(JSP页面)

<%@ page language="java"contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

       <formaction="${pageContext.request.contextPath }/some/upload.do"

                method="POST"enctype="multipart/form-data">

              照片:<inputtype="file"name="photo"/><br>

              <inputtype="submit"value="上传"/>

       </form>

</body>

</html>

要求表单请求必须是“POST”,enctype =”multipart/form-data”,需要提供一个 type=”file”的标签。

C、  编写处理器

package com.abc.handlers;

 

import java.io.File;

 

import javax.servlet.http.HttpSession;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.multipart.MultipartFile;

 

// 定义处理器

@Controller

@RequestMapping("/some") 

public class SomeHandler {

 

         @RequestMapping("/upload.do")

         public String doUpload(MultipartFilephoto, HttpSession session) throws Exception {

                   if (!photo.isEmpty()) {

                            // String path = "E:/images";

                            String path = session.getServletContext().getRealPath("/images");

                            // 获取客户端上传文件的原始文件名

                            String fileName = System.currentTimeMillis() + photo.getOriginalFilename();

                            if (fileName.endsWith(".jpg") || fileName.endsWith(".png")) {

                                     File file = new File(path, fileName);

                                     photo.transferTo(file);

                                     return "/WEB-INF/jsp/welcome.jsp";

                            }

                   }

                   return "/message.jsp";

         }

        

}

 

接收参数:MultipartFile photo 这个参数的回传,需要提供一个MultiPart解析器。

 

通过transferTo来实现文件的上传。

photo.transferTo(file);

(2)       定义文件上传处理器

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

 

       <!-- 注册组件扫描器 -->

       <context:component-scanbase-package="com.abc.handlers"/>

 

       <!-- 注册MVC注解驱动 -->

       <mvc:annotation-driven/>

 

       <!-- 注册Multipart请求解析器 -->

       <beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

              <propertyname="defaultEncoding"value="UTF-8"/>

              <propertyname="maxUploadSize"value="#{1024 * 1024 *2}"/> <!-- SPEL -->

       </bean>

      

 

</beans>

 

注意:<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

Id=” multipartResolver” id 值必须是这个参数,在源码中可知。

(3)       源码分析

解释为什么id值必须为“multipartResolver”?


初始化方法


doDispatch


(4)       文件上传出现的问题

没有上传文件,但是提交了请求

         if(!photo.isEmpty()){

 

}

当不提交文件时,该photo参数并不为空,既对象不为空。MultpartFile 提供了一个方法isEmpty(),来判断是否为空

上传文件同名问题:

使用一个随机数追加到文件名前面。

String fileName =System.currentTimeMillis() + photo.getOriginalFilename();

上传文件名中文乱码问题:

两种解决方式:

在Springmvc.xml 文件中配置:

<!-- 注册Multipart请求解析器 -->

<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

                   <property name="defaultEncoding"value="UTF-8"/>

                   <propertyname="maxUploadSize" value="#{1024 * 1024 *2}"/>  <!-- SPEL -->

</bean>

配置中文乱码过滤器:

<filter>

    <filter-name>CharacterEncodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>

      <param-name>encoding</param-name>

      <param-value>UTF-8</param-value>

    </init-param>

    <init-param>

      <param-name>forceEncoding</param-name>

      <param-value>true</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>CharacterEncodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

 

一般两种方式都配置。

(5)       限制文件上传大小

       <!-- 注册Multipart请求解析器 -->

       <beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

              <propertyname="defaultEncoding"value="UTF-8"/>

              <property name="maxUploadSize" value="#{1024 * 1024 *2}"/>  <!-- SPEL -->

       </bean>

 

(6)       上传多个文件

Jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

         <form action="${pageContext.request.contextPath }/some/upload.do"

                     method="POST" enctype="multipart/form-data">

                   照片1:<input type="file" name="photos"/><br>

                   照片2:<input type="file" name="photos"/><br>

                   照片3:<input type="file" name="photos"/><br>

                   <input type="submit" value="上传"/>

         </form>

</body>

</html>

 

 

处理器方法

package com.abc.handlers;

 

import java.io.File;

 

import javax.servlet.http.HttpSession;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.multipart.MultipartFile;

 

// 定义处理器

@Controller

@RequestMapping("/some") 

public class SomeHandler {

 

         @RequestMapping("/upload.do")

         // SpringMVC使用低版本时,需要使用@RequestParam对数组参数进行校正

         // public String doUpload(@RequestParam MultipartFile[] photos, HttpSession session) throws Exception { 

         public String doUpload(MultipartFile[] photos, HttpSession session) throws Exception {

                   boolean flag = false;

                   for (int i = 0; i < photos.length; i++) {

                            if (!photos[i].isEmpty()) {

                                     // String path = "E:/images";

                                     String path = session.getServletContext().getRealPath("/images");

                                     // 获取客户端上传文件的原始文件名

                                     String fileName = System.currentTimeMillis() + photos[i].getOriginalFilename();

                                     if (fileName.endsWith(".jpg") || fileName.endsWith(".png")) {

                                               File file = new File(path, fileName);

                                               photos[i].transferTo(file);

                                               flag = true;

                                     }

                            }

                   }

                   if(flag) {

                            return "/WEB-INF/jsp/welcome.jsp";

                   }

                   return "/message.jsp";

         }

        

}

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 工伤认定没有证人证言怎么办? 一个月没来月经怎么办14岁 刮了胡子下巴痒怎么办 月经多怎么办喝什么好 大姨妈不调怎么办来了 多人被骗没证据怎么办 一直坏肚子拉水怎么办 犯人在监狱有高危高血压怎么办 丈夫出轨他死都不承认怎么办 没写欠条的债该怎么办 被尾随回家知道住处怎么办 微信记录全没了怎么办 微信记录没有了怎么办 ipad登录不了下不了软件怎么办 苹果手机打开自动时间不对怎么办 魅族手机时间不同步怎么办 小米手环时间不准怎么办 电脑网络dns配置错误怎么办 去泰国手机要打电话怎么办 苹果6s音量小怎么办 三星0n7充电慢怎么办 在国外接受不到验证码怎么办 ip地址错误网络无法连通怎么办 注册微信收不到验证码怎么办 安卓手机收不到短信怎么办 手机被短信验证码轰炸怎么办 美国访学一年手机卡怎么办方便 小狗吃了葡萄皮怎么办 ios迅雷下载不了的资源怎么办 ipad软件商店内容少怎么办? 脸摔伤后留下黑印怎么办 不确定孩子是不是老公的怎么办 孩子接种证丢了怎么办 孩子的出生证丢了怎么办 私秘边上肿了怎么办 书法作品少写一个字怎么办 炉石传说ios闪退怎么办 ck手表表链大了怎么办 天梭手表卡扣坏了怎么办 机械表平时不戴怎么办 天梭机械表慢了怎么办