Spring MVC使用commons fileupload实现文件上传功能

通过Maven建立Spring MVC项目,引入了Spring相关jar依赖。

1、为了使用commons fileupload组件,需要在pom.xml中添加依赖;

  <properties>
        <spring.version>3.0.7.RELEASE </spring.version>
        <junit.version>3.8.1</junit.version>
        <fileupload.version>1.2.2</fileupload.version>
    </properties>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>${fileupload.version}</version>
    </dependency>

2、配置Spring MVC,项目成功启动后,编写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>Errors导入Excel</title>
    </head>
    <body>
        <div>
            <!--只有将表单的enctype设置为multipart/form-data,才能实现文件上传;表单enctype的默认值为:application/x-www-form-urlencoded-->
            <!--只有POST方法才会被解析为文件上传请求    -->
            <form action="./fileupload" method="post" enctype="multipart/form-data">
                <!-- 不知道为啥,type="file"这一标签必须同时添加name属性,否则在处理上传时,无法检测到上传文件 -->
                <input type="file" name="fileField"/>
                <input type="submit" value="上传"/>
            </form>
            <p><font color="red">上传文件大小限制在1M之内</font></p>
        </div>
    </body>
</html>

注:注释当中的内容还是很重要的,使用时遇到了比较多奇葩的问题,暂时还未弄明白原因,留待日后解决。
注:实现上传文件的表单,需要指定method="post"且enctype="multipart/form-data",否则无法通过fileupload组件解析为上传请求。

3、编写Controller,名为FileUploadController,在Controller中对上传文件进行处理;

 1 @Controller
 2 public class FileUploadController {
 3
 4     @RequestMapping("/fileupload")
 5     public String handleFileUpload(HttpServletRequest request){
 6         boolean flag = false;
 7
 8         //判断是否是文件上传请求
 9         if(ServletFileUpload.isMultipartContent(request)){
10             // 创建文件上传处理器
11             ServletFileUpload upload = new ServletFileUpload();
12             //限制单个上传文件的大小
13             upload.setFileSizeMax(1L<<24);
14
15             try {
16                 // 解析请求
17                 FileItemIterator iter = upload.getItemIterator(request);
18
19                 while (iter.hasNext()) {
20                     FileItemStream item = iter.next();
21
22                     if (!item.isFormField()) {
23                         //是文件上传对象,获取上传文件的输入流
24                         InputStream srcinInputStream = item.openStream();
25                         /*对上传文件的输入流进行处理,跟本地的文件流处理方式相同*/
26
27                     }
28                 }
29             } catch (FileUploadException e) {
30                 System.out.println("上传文件过大");
31             } catch (IOException e) {
32                 System.out.println("文件读取出现问题");
33             }
34         }
35
36         return flag? "success":"error";
37     }
38 }

注:commons fileupload的用户指南 http://commons.apache.org/proper/commons-fileupload/using.html;
注:判断上传请求及处理使用了Streaming API http://commons.apache.org/proper/commons-fileupload/streaming.html;
内容如下:

注:第一次看commons fileupload组件的用户指南时,感觉无从下手,其实User Guide的Parsing the request部分已经给出了很明确的说明。可以通过在对应的请求处理方法中直接通过ServletFileUpload.isMultipartContent(request)来判断是否是文件上传请求,通过 !item.isFormField() 来判断是否是文件上传对象;

4、fileupload组件上传文件时,获取普通域参数值和文件域输入流;
html元素的form表单的enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。表单的enctype默认值为 "application/x-www-form-urlencoded",在表单发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值);对于文件上传,form表单的enctype="multipart/form-data",此时form表单不对字符编码,此时在请求的处理函数中无法通过request.getParameter("parameterName")来获取参数值;

但是可以通过其他方式来获取参数值;

 1   /**
 2      * 获取页面传递的参数,以Map存储,以fieldName为键值,普通域存储value,文件上传域存储文件输入流
 3      * @param request
 4      * @return
 5      */
 6     private Map<String, Object> getParameters(HttpServletRequest request){
 7         Map<String, Object> parameters = new HashMap<String, Object>();
 8
 9         // 默认最多允许存储1024个字节
10         DiskFileItemFactory factory = new DiskFileItemFactory();
11
12         if(ServletFileUpload.isMultipartContent(request)){
13             ServletFileUpload upload = new ServletFileUpload(factory);
14
15             try{
16                 List<FileItem> items =upload.parseRequest(request);
17
18                 for(Iterator<FileItem> iter = items.iterator(); iter.hasNext();){
19                     FileItem item = iter.next();
20
21                     if(item.isFormField()){
22                         //普通域,取参数值
23                         parameters.put(item.getFieldName(), item.getString());
24                     }else{
25                         //文件上传域,取输入流
26                         parameters.put(item.getFieldName(), item.getInputStream());
27                     }
28                 }
29             }catch(Exception exception){
30                 exception.printStackTrace();
31             }
32         }
33
34         return parameters;
35     }

Spring MVC使用commons fileupload实现文件上传功能,布布扣,bubuko.com

时间: 08-17

Spring MVC使用commons fileupload实现文件上传功能的相关文章

Apache Commons fileUpload实现文件上传之一

  需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http

Apache Commons FileUpload实现文件上传

Commons FileUpload简介 Apache Commons是一个专注于可重用Java组件开发的 Apache 项目.Apache Commons项目由三个部分组成: 1.Commons Proper - 可重用Java组件的存储库. 2.The Commons Sandbox - 用于Java组件开发的工作区. 3.The Commons Dormant - 当前不活动的组件存储库. Commons-FileUpload是Commons Proper中的一个组件,该组件依赖于Comm

完成FileUpload的文件上传功能,且可改按钮样式

FileUpload控件: 更改按钮样式思路: 自己定义一个按钮,设置该按钮的样式,然后将FileUpload控件通过定位定在自己定义的按钮上面,设置z-index,使得控件浮在自己定义的按钮上面,记得设置该控件为透明,这样,看着点的是自己定义的那个按钮,实际上点击的是控件,然后定义一个"上传"按钮,点击上传按钮时进入代码层: 上传文件思路: 1)确定上传文件所保存的路径: 2)判断路径是否存在,存在则继续,不存在则创建: 3)获取上传文件的上传路径 或者文件名 4)保存文件: 多文件

使用Commons FileUpLoad组件实现文件上传功能

Commons 是Apache开放的源码组织的一个java子项目,该项目主要涉及一些开发中常用的模块,如文件上传,命令行处理,数据库连接池等.FileUpLoad就是其中的一个用于处理HTTP文件上传的子项目.Commons FileUpLoad组建具有以下几个特点: 1.使用简单:Commons FileUpLoad组件可以方便的嵌入JSP文件中,在JSP文件中仅编写少量代码就可完成文件上传功能,十分方便. 2.能够全程控制上传的内容:使用Commons FileUpLoad组件提供的对象及操

MVC中使用Ajax和HTML5实现文件上传功能

引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功能 高级功能:通过拖拽文件的操作实现多个文件上传功能 背景 HTML5提供了一种标准的访问本地文件的方法——File API规格说明,通过调用File API 能够访问文件信息,也可以利用客户端来验证上传文件的类型和大小是否规范. 该规格说明包含以下几个接口来使用文件: File接口:具有文件的“读

使用fileupload实现文件上传(1)

一. fileupload组件工作原理 先来张图片, 帮助大家理解 fileupload核心API 1. DiskFileItemFactory构造器1) DiskFileItemFactory() // 使用默认配置2) DiskFileItemFactory(int sizeThreshold, File repository) sizeThreshold 内存缓冲区, 不能设置太大, 否则会导致JVM崩溃 repository 临时文件目录 2. ServletFileUpload1) i

【SSH网上商城项目实战13】Struts2实现文件上传功能

上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说.为此,这篇文章详细介绍一下Struts2实现文件上传的功能. 1. 封装文件信息 我们首先得有一个Model来封装文件的信息,这个Model里需要有三个属性:文件.文件类型和文件名.针对我们要传的图片,我们新建一个Model如下: public class FileImage { private File file; private String contentType; private String fi

MVC5:使用Ajax和HTML5实现文件上传功能

引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功能 高级功能:通过拖拽文件的操作实现多个文件上传功能 背景 HTML5提供了一种标准的访问本地文件的方法--File API规格说明,通过调用File API 能够访问文件信息,也可以利用客户端来验证上传文件的类型和大小是否规范. 该规格说明包含以下几个接口来使用文件: File接口:具有文件的"读

nodejs 实现简单的文件上传功能

首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传功能,优点:浏览器兼容好. 3.通过xhr level2的异步请求,可以百度formData对象. 这里使用2做个练习. node插件请看下package.json文件 { "name": "upload", "version": "0.1