SpringMVC札集(08)——文件上传


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


在本篇博客中将介绍利用SpringMVC实现文件上传

准备jar包

除了之前SpringMVC开发所必备的jar包外,还需要额外准备两个jar包用于文件上传,如下图所示:

这里写图片描述


配置springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">


    <!-- 配置自动扫描 -->
    <context:component-scan base-package="cn.com"></context:component-scan>

    <!-- 配置注解开发所需的处理器映射器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

    <!-- 配置注解开发所需的处理器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
        <list>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
        </list>
        </property>
    </bean>

    <!-- 开启文件上传 -->
    <bean id="multipartResolver"   class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    
        <property name="maxUploadSize">    
            <value>1048576000</value>    
        </property>    
            <property name="maxInMemorySize">  
            <value>1024</value>  
        </property>  
    </bean>

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsps/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>
  • 开启SpingMVC的图片上传,请参见代码第35-43行
  • 配置bean的id为multipartResolver
  • 配置上传的最大大小等属性

编写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>测试SpringMVC的文件上传</title>
</head>
<body>
    <form action="${pageContext.request.contextPath }/testUpload/uploadFile.do"  method="post" enctype="multipart/form-data">
        <input type="file" name="fileupload"> <input type="submit" value="upload" />
    </form>
</body>
</html>
  • 设置表单上传方式为post
  • 设置enctype的值为multipart/form-data
  • 利用type为file类型的input上传文件

实现Controller

/** 
* @author 原创作者:谷哥的小弟
* @blog   博客地址:http://blog.csdn.net/lfdfhl
* @time   创建时间:2017年7月31日 上午11:38:26 
* @info   描述信息:SpringMVC上传文件
*/
package cn.com.controller;
import java.io.File;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

@Controller
@RequestMapping("/testUpload")
public class SpringMVCUpload {
    @RequestMapping("uploadFile")
    public String uploadFile(HttpServletRequest request)throws Exception {
        Map<String, String[]> parameterMap = request.getParameterMap();
        if(parameterMap!=null){
            Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();
            if(entrySet!=null){
                Iterator<Entry<String, String[]>> iterator = entrySet.iterator();
                while (iterator.hasNext()) {
                    Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) iterator.next();
                    String key = entry.getKey();
                    System.out.println("key="+key);
                    String[] values = entry.getValue();
                    System.out.println("value="+Arrays.toString(values));
                }
            }
        }
        File uploadedFolderFile=new File("E:/upload");
        if(!uploadedFolderFile.exists()){
            uploadedFolderFile.mkdirs();
        }
        ServletContext servletContext=request.getSession().getServletContext();
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(servletContext);
        if (multipartResolver.isMultipart(request)) {
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            Iterator<String> iterator = multiRequest.getFileNames();
            while (iterator.hasNext()) {
                MultipartFile multipartFile = multiRequest.getFile(iterator.next());
                if (multipartFile != null) {
                    String parentPath=uploadedFolderFile.getAbsolutePath()+File.separator;
                    String originalFilename = multipartFile.getOriginalFilename();
                    String path = parentPath + originalFilename;
                    File file=new File(path);
                    multipartFile.transferTo(file);
                }
            }
        }
        return "/test";
    }


}

部署测试

这里写图片描述

选择图片后,点击upload上传。

嗯哼,现在来瞅瞅传到服务端的图片

这里写图片描述

OK!

### 回答1: CommonsMultipartResolver 是一个用于解析多部分请求的类,它是 Apache Commons FileUpload 库的一部分。它可以解析上传文件并将其存储在服务器上。在 Spring MVC 中,可以使用 CommonsMultipartResolver 来处理文件上传请求。 ### 回答2: CommonsMultipartResolver (以下简称CMR)是一个用于处理多部分请求(multipart request)的 Spring 框架类,用于上传文件或数据的处理。 当我们使用 HTML 表单上传文件时,表单的 enctype 属性必须设置为 "multipart/form-data"。这时,对于上传文件,服务器需要分离出文件和其他表单项,并将它们分别处理。CMR 类正是用来完成这个工作的。 CMR 类需要集成 Apache Commons FileUpload 库,该库提供了对上传文件的全面支持。CMR 类是 Spring 对 FileUpload 库的包装器,它使用受支持的解析器对 multipart 文件进行处理,并将解析的内容存储在 Spring 提供的 MultipartHttpServletRequest 中,以便更容易地进行处理。 对于上传文件,我们通常需要保存在服务器上或存储在数据库中。CMR 也能够实现这些功能。通过 CMR 的 setUploadTempDir() 方法,可以设置存储上传文件的临时目录。当 CMR 完成对文件的处理后,我们可以直接访问上传文件,然后将其保存到我们需要的位置,或者将其存储到数据库中。 在 Spring 3.1 之前,CMR 是默认的 MultipartResolver 实现,但在 Spring 3.1 的更改后,它已经换成了 StandardServletMultipartResolver。但是,如果你选择使用 CMR,你可以轻松地使用它来上传任意大小的文件,同时又不会占用过多的内存。这也是 Spring 对 CMR 停止默认支持的一个原因,因为它需要依赖第三方库,会让项目变得更加臃肿。 总而言之,CommonsMultipartResolver 是一个用于处理多部分请求的强大工具,它能够快速而准确地将上传文件和其他表单项进行分离,并将它们存储在请求对象中,以便于我们进行处理和管理。通过它,我们可以方便地上传任意大小的文件,并将它们存储到我们需要的位置,这些都是非常实用的功能。 ### 回答3: CommonsMultipartResolver是一个Spring框架的类,用于处理multipart/form-data类型的请求。multipart/form-data类型的请求常用于文件上传图片上传等场景。 在Spring框架中,我们可以使用文件上传的注解@RequestParam或@RequestPart来处理multipart/form-data类型的请求,但这两种方式只适用于单个文件上传。如果需要上传多个文件,则需要使用CommonsMultipartResolver。 CommonsMultipartResolver主要的作用是解析multipart/form-data类型的请求,并将请求中的文件保存到指定的位置。在Spring框架中,我们可以通过将CommonsMultipartResolver实例化并将其注册到Spring的DispatcherServlet中来完成文件上传的工作。 CommonsMultipartResolver可以通过配置一些参数来控制文件上传的行为,比如文件大小的限制、文件上传的临时目录、上传文件的字符编码等等。通过设置这些参数,我们可以更好地控制文件上传的过程,并保证文件上传的安全性。 在使用CommonsMultipartResolver时,我们需要注意一些细节,比如文件上传失败的异常处理、设置上传文件的真实名称、上传文件的自定义校验等等。这些细节的处理需要我们在编写代码时多加注意,保证文件上传功能的稳定和可靠。 总之,CommonsMultipartResolver是一个非常常用的Spring框架类,可以帮助我们实现多文件上传的功能。在使用CommonsMultipartResolver时,我们需要注意一些细节,并根据需要配置相应的参数以实现更好的文件上传体验。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值