(转)Spring文件上传,包括一次选中多个文件

背景:

http://www.cnblogs.com/lixuwu/p/8495275.html已经实现了单文件的上传和下载,多文件的上传是另一种情景,这里记录下来

实现过程

先说前台. 运行以后就是这样子的. 一个非常简单的表单页面, 两个文件上传按钮, 一个提交

其中单个文件上传, 即只能选择一个文件, 无法同时选择多个

相对的, 多个文件就是可以同时选择多个文件了

文件选择以后就是这个样子

前台设置

代码如下: 一个form, 文件上传就是一个<input>输入, 属性type="file". 此时只能选择单个文件. 而后面加一个multiple, 即可同时选择多个文件

jsp页面multiFile.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}/test/upload" enctype="multipart/form-data" method="post">
        单个文件: <input type="file" name="fileTest"><br/>
        多个文件: <input type="file" name="fileList" multiple/></br/>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

spring中文件控制bean:

package spring.boot.uploadfile.config;

import javax.servlet.MultipartConfigElement;

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

/**
 * ClassName:ConfigClass <br/>
 * Function: TODO  <br/>
 * Date:     2018年3月2日 下午8:20:05 <br/>
 * @author   prd-lxw
 * @version   1.0
 * @since    JDK 1.7
 * @see
 */
/**
 * classpath路径:locations={"classpath:application-bean1.xml","classpath:application-bean2.xml"}
 * file路径: locations = {"file:d:/test/application-bean1.xml"};
 */
@Configuration
@ImportResource(locations = { "classpath:spring-web.xml" })
//@ImportResource(locations={"file:d:/test/application-bean1.xml"})
public class ConfigClass {

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //文件最大
        factory.setMaxFileSize("1000240KB"); //KB,MB
        /// 设置总上传数据总大小
        factory.setMaxRequestSize("102400KB");
        return factory.createMultipartConfig();
    }

}

后台代码

Controller层代码:

/**
 * Project Name:uploadfile
 * File Name:MutilFileUploadController.java
 * Package Name:spring.boot.uploadfile.controller
 * Date:2018年3月2日下午9:50:25
 * Copyright (c) 2018, 深圳金融电子结算中心 All Rights Reserved.
 *
*/

package spring.boot.uploadfile.controller;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

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

/**
 * ClassName:MutilFileUploadController <br/>
 * Function: TODO  <br/>
 * Date:     2018年3月2日 下午9:50:25 <br/>
 * @author   prd-lxw
 * @version   1.0
 * @since    JDK 1.7
 * @see
 */
/**
 * 文件上传测试类
 */
@Controller
@RequestMapping("/test")
public class MutilFileUploadController {
    @RequestMapping("multi")
    public String multiIndex() {
        return "multiFile";
    }

    @ResponseBody
    @RequestMapping(value = "upload")
    public void testUpload(MultipartHttpServletRequest request) throws IOException {
        /*
         * MultipartHttpServletRequest: 继承于HttpServletRequest以及MultipartRequest.
         * 其中MultipartRequest中定义了相关的访问操作. MultipartHttpServletRequest重写
         * 了HttpServletRequest中的方法, 并进行了扩展. 如果以HttpServletRequest来接收参
         * 数, 则需要先将其转为MultipartHttpServletRequest类型
         * MultipartHttpServletRequest request = (MultipartHttpServletRequest) HttpServletRequest;
         */

        /*
         * 再说回刚才的form, 假设我们在单个文件选框中上传了文件1, 多个文件选框中上传了文件2, 3, 4.
         * 那么对于后台接收到的, 可以这么理解, 就是一个Map的形式(实际上它后台真的是以Map来存储的).
         * 这个Map的Key是什么呢? 就是上面<input>标签中的name=""属性. Value则是我们刚才上传的
         * 文件, 通过下面的示例可以看出每一个Value就是一个包含对应文件集合的List
         *
         * 传到后台接收到的Map就是这样:
         * fileTest: 文件1
         * fileList: 文件2, 文件3, 文件4
         *
         * 虽然从方法名的表面意义来看是得到文件名, 但实际上这个文件名跟上传的文件本身并没有什么关系.
         * 刚才说了这个Map的Key就是<input>标签中的name=""属性, 所以得到的也就是这个属性的值
         */
        Iterator<String> fileNames = request.getFileNames();

        while (fileNames.hasNext()) {

            //把fileNames集合中的值打出来
            String fileName = fileNames.next();
            System.out.println("fileName: " + fileName);

            /*
             * request.getFiles(fileName)方法即通过fileName这个Key, 得到对应的文件
             * 集合列表. 只是在这个Map中, 文件被包装成MultipartFile类型
             */
            List<MultipartFile> fileList = request.getFiles(fileName);

            if (fileList.size() > 0) {

                //遍历文件列表
                Iterator<MultipartFile> fileIte = fileList.iterator();

                while (fileIte.hasNext()) {

                    //获得每一个文件
                    MultipartFile multipartFile = fileIte.next();

                    //获得原文件名
                    String originalFilename = multipartFile.getOriginalFilename();
                    System.out.println("originalFilename: " + originalFilename);

                    //设置保存路径.
                    String path = "E:\\testJava\\filesss";

                    //检查该路径对应的目录是否存在. 如果不存在则创建目录
                    File dir = new File(path);
                    if (!dir.exists()) {
                        dir.mkdirs();
                    }

                    String filePath = path + File.separator + originalFilename;
                    System.out.println("filePath: " + filePath);

                    //保存文件
                    File dest = new File(filePath);
                    if (!(dest.exists())) {
                        /*
                         * MultipartFile提供了void transferTo(File dest)方法,
                         * 将获取到的文件以File形式传输至指定路径.
                         */
                        multipartFile.transferTo(dest);

                        /*
                         * 如果需对文件进行其他操作, MultipartFile也提供了
                         * InputStream getInputStream()方法获取文件的输入流
                         *
                         * 例如下面的语句即为通过
                         * org.apache.commons.io.FileUtils提供的
                         * void copyInputStreamToFile(InputStream source, File destination)
                         * 方法, 获取输入流后将其保存至指定路径
                         */
                        //FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), dest);
                    }

                    //MultipartFile也提供了其他一些方法, 用来获取文件的部分属性  

                    //获取文件contentType
                    String contentType = multipartFile.getContentType();
                    System.out.println("contentType: " + contentType);

                    /*
                     * 获取name
                     * 其实这个name跟上面提到的getFileName值是一样的,
                     * 就是Map中Key的值. 即前台页面<input>中name=""
                     * 属性. 但是上面的getFileName只是得到这个Map的Key,
                     * 而Spring在处理上传文件的时候会把这个值以name属性
                     * 记录到对应的每一个文件. 如果需要从文件层面获取这个
                     * 值, 则可以使用该方法
                     */
                    String name = multipartFile.getName();
                    System.out.println("name: " + name);

                    //获取文件大小, 单位为字节
                    long size = multipartFile.getSize();
                    System.out.println("size: " + size);

                    System.out.println("---------------------------------------------------");
                }
            }
        }
    }
}

ps:上面的注释很简单,对照着实现就可以了

原文地址:https://www.cnblogs.com/lixuwu/p/8495504.html

时间: 2024-08-28 16:14:42

(转)Spring文件上传,包括一次选中多个文件的相关文章

[转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例

原文地址:http://www.stepday.com/topic/?459 作文一个ExtJs的入门汉子,学习起来的确是比较费劲的事情,不过如今在这样一个网络资源如此丰富的时代,依然不是那么难了的.基本上都是Copy过来加以部分改造即可实现自己想要的功能,加之如今的第三方开发者也大发慈悲地写出了API的帮助文档以及示例文档.关于ExtJs内的文件上传,将从以下几个方面进行展开讲解: 一.ExtJs文件上传版面的布局以及配置 因为ExtJs的文件上传组件filefield是基于form表单提交数

Excel文件上传,解析,下载(一 文件上传,使用MultipartFile来实现)

文件上传我使用的是jquery的一个插件"ajaxfileupload.js",使用方式详见下面的一种方式,使用file类型的input,同时需要给button绑定事件,这边使用的"ajaxfileupload.js"当中定义的ajax请求,到后台. <div id="fileupload"> <input type="file" id="file" name="file&quo

AJAX文件上传实践与分析,带HTML5文件上传API。

对于HTML5已经支持AJAX文件上传了,但如果需要兼容的话还是得用一点小技巧的,HTML5等等介绍,先来看看以前我们是怎么写的. 网上可能会有一些叫AJAX文件上传插件,但在AJAX2.0之前是不可能实现的,因为浏览器的原因,AJAX根本获取不了文件信息,当然这里并不是说就不能文件上传了,只是说在AJAX2.0之前所谓的AJAX文件上传都是假冒的,核心更本没有用AJAX,而是利用iframe实现的,下面我们来看看如何利用iframe实现页面无刷新上传文件. iframe无刷新上传文件版. ht

改变FileUpload文件上传控件的显示方式,选择文件后自动上传

一.Aspx页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUploadDemo.aspx.cs" Inherits="WebApplication1.FileUploadDemo" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu

Spring中实现文件上传

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt110 实现图片上传  用户必须能够上传图片,因此需要文件上传的功能.比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/commons/fileupload/a>)和COS FileUpload(http://www.servlets.com/cos),Spring已经完全集成了这两种组件,这里我们选择Commo

Spring中MultipartHttpServletRequest实现文件上传 生成缩略图

转贴自:http://my.oschina.net/nyniuch/blog/185266 实现图片上传  用户必须能够上传图片,因此需要文件上传的功能.比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/commons/fileupload/a>)和COS FileUpload(http://www.servlets.com/cos),Spring已经完全集成了这两种组件,这里我们选择Commons FileUpload.  由于P

[转载]Spring中MultipartHttpServletRequest实现文件上传

实现图片上传  用户必须能够上传图片,因此需要文件上传的功能.比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/commons/fileupload/a>)和COS FileUpload(http://www.servlets.com/cos),Spring已经完全集成了这两种组件,这里我们选择Commons FileUpload.  由于Post一个包含文件上传的Form会以multipart/form-data请求发送给服务器,

文件上传--基于Spring MVC框架+SmartUpload

这篇文章是介绍文件上传的,由于在spring MVC上实现起来和直接在servlet中写有些不同,所以特地写了一下这篇文章,关于不同点,大家可以先阅读一下上一篇文章.好了,下面直接上代码. jab包是jspSmartUpload.jar,如果有类似的jar包如:commons-fileupload-1.2.2,留一个即可,否则会冲突报错 首先是一个简单的页面(jsp),比较丑,但能用: <%@ page language="java" contentType="text

Spring中MultipartHttpServletRequest实现文件上传

Spring中MultipartHttpServletRequest实现文件上传 转贴自:http://my.oschina.net/nyniuch/blog/185266 实现图片上传  用户必须能够上传图片,因此需要文件上传的功能.比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/commons/fileupload/a>)和COS FileUpload(http://www.servlets.com/cos),spring已经