`

多文件上传 by MultipartFile and Multiple

阅读更多

最近的一个项目中,需要用到一个多文件上传,项目组长推荐了一个 jQuery Multiple File Upload Plugin http://www.fyneworks.com/jquery/multiple-file-upload/ )让我调研一下,简单研究了一下,感觉还不错,就拿出来晒晒。

首先我这里因为项目中使用的是 SpringMVC ,所以这边后台我就直接使用 Spring 中的 MultipartFile 中进行处理。

我们在 multifile 中可以很容易的发现如何使用,这里就简单说说了,首先在页面上我们需要有这样几行标签代码

<!-- 注意这里的attach名字为固定,如果要控制上传的格式,则追加accept="doc|txt|jsp"  最大上传量maxlength="3" -->
	<input type="file" name="attach" id="multiFileId" class=" input_txt"/>
	<div id="multiFileId-list"></div>

然后在该页面中引入相关的JS和CSS

<script src="./js/multifile/jquery.MetaData.js" type="text/javascript"></script>
<script src="./js/multifile/jquery.MultiFile.js" type="text/javascript"></script>
<script src="./js/multifile/jquery.blockUI.js" type="text/javascript"></script>
<script src="./js/multifile/documentation.js" type="text/javascript"></script>
<link href="./js/multifile/documentation.css" type="text/css" rel="stylesheet" />

然后通过js和设置刚刚写入的标签

<script type="text/javascript">
	$(function() {
		//加载多文件上传的JS
		$('#multiFileId').MultiFile(
						{
							list : '#multiFileId-list',
							STRING : {
								remove : '<img src="http://www.fyneworks.com/i/bin.gif" height="16" width="16" alt="x"/>'
							}
						});
	});
</script>

 

当然,上面的这段 JS 以及上面的 HTML 标签,我们可以根据实际的情况参考官网上的 Demo 上说明的属性进行设置。

Ok ,前台我们使用这个插件的地方基本就 ok 了,下面我们需要关心的是后台我们如何处理这里上传的多文件进行保存。在调研的过程中我将这一部分简单的写了一个工具类。

首先在 Controller 里接收

@RequestMapping(value="/uploadFile/upload.ac", method = RequestMethod.POST)
	public String uploadFile(HttpServletRequest request,
			HttpServletResponse response) {
		List<MultipartFile> multipartFiles = UploadHelper.getFileSet(request, 1024 * 20, null);
		String path = "D:" + File.separator;
		if (multipartFiles.size() == 0) {
			// TODO 给出提示,不允许没选择文件点击上传

		}
		for (MultipartFile multipartFile : multipartFiles) {
			try {
				String filePath = UploadHelper.uploadFile(multipartFile, path);
				System.out.println(filePath);
			} catch (Exception e) {
				e.printStackTrace();
			}
			// 拿到的imgPath就是图片的相对于contextPath的存储路径了
		}
		return null;
	}

UploadHelper.java

package org.elongcom.common;

import java.io.File;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

/**
 * @author xdwang
 * 
 * @create 2012-11-19 下午6:24:03
 * 
 * @email:xdwangiflytek@gmail.com
 * 
 * @description 上传帮助类
 * 
 */
public class UploadHelper {

	/**
	 * @descrption 根据HttpServletRequest对象获取MultipartFile集合
	 * @author xdwang
	 * @create 2012-11-19下午5:11:41
	 * @param request
	 * @param maxLength
	 *            文件最大限制
	 * @param allowExtName
	 *            不允许上传的文件扩展名
	 * @return MultipartFile集合
	 */
	public static List<MultipartFile> getFileSet(HttpServletRequest request,
			long maxLength, String[] allowExtName) {
		MultipartHttpServletRequest multipartRequest = null;
		try {
			multipartRequest = (MultipartHttpServletRequest) request;
		} catch (Exception e) {
			return new LinkedList<MultipartFile>();
		}

		List<MultipartFile> files = new LinkedList<MultipartFile>();
		files = multipartRequest.getFiles("attach");
		// 移除不符合条件的
		for (int i = 0; i < files.size(); i++) {
			if (!validateFile(files.get(i), maxLength, allowExtName)) {
				files.remove(files.get(i));
				if (files.size() == 0) {
					return files;
				}
			}
		}
		return files;
	}

	/**
	 * @descrption 保存文件
	 * @author xdwang
	 * @create 2012-11-19下午4:17:36
	 * @param file
	 *            MultipartFile对象
	 * @param path
	 *            保存路径,如“D:\\File\\”
	 * @return 保存的全路径 如“D:\\File\\2345678.txt”
	 * @throws Exception
	 *             文件保存失败
	 */
	public static String uploadFile(MultipartFile file, String path)
			throws Exception {

		String filename = file.getOriginalFilename();
		String extName = filename.substring(filename.lastIndexOf("."))
				.toLowerCase();
		String lastFileName = UUID.randomUUID().toString() + extName;
		if (!path.endsWith(File.separator)) {
			path = path + File.separator;
		}
		File temp = new File(path);
		if (!temp.isDirectory()) {
			temp.mkdir();
		}
		// 图片存储的全路径
		String fileFullPath = path + lastFileName;
		FileCopyUtils.copy(file.getBytes(), new File(fileFullPath));
		return fileFullPath;
	}

	/**
	 * @descrption 验证文件格式,这里主要验证后缀名
	 * @author xdwang
	 * @create 2012-11-19下午4:08:12
	 * @param file
	 *            MultipartFile对象
	 * @param maxLength
	 *            文件最大限制
	 * @param allowExtName
	 *            不允许上传的文件扩展名
	 * @return 文件格式是否合法
	 */
	private static boolean validateFile(MultipartFile file, long maxLength,
			String[] allowExtName) {
		if (file.getSize() < 0 || file.getSize() > maxLength)
			return false;
		String filename = file.getOriginalFilename();

		// 处理不选择文件点击上传时,也会有MultipartFile对象,在此进行过滤
		if (filename == "") {
			return false;
		}
		String extName = filename.substring(filename.lastIndexOf("."))
				.toLowerCase();
		if (allowExtName == null || allowExtName.length == 0
				|| Arrays.binarySearch(allowExtName, extName) != -1) {
			return true;
		} else {
			return false;
		}
	}

}


这里需要多说一点的是,表单提交时如果有文件进行上传时,需要在表单上设置enctype="multipart/form-data",否则上面的 multipartRequest = (MultipartHttpServletRequest) request;进行强转时会报错。

Ok,收工。

分享到:
评论
2 楼 u013107014 2016-07-27  
multipartRequest.getFiles("attach");   一直为0
1 楼 love_zongming 2013-07-11  

List<MultipartFile> files = new LinkedList<MultipartFile>();  
        files = multipartRequest.getFiles("attach"); 


 请选择文件: <input type="file" name="attach"/><br/>  
    请选择文件: <input type="file" name="attach"/><br/> 


请问下 , 你页面传递的文件name 是这样子的么?
我在调用multipartRequest.getFiles("attach");这个方法的时候, 没有找到getFiles(),只有getFile(),调用了getFile()方法,会一直报如下错误:

org.springframework.web.multipart.MultipartException: Multiple files for field name [myfiles] found - not supported by MultipartResolver
	at org.springframework.web.multipart.commons.CommonsFileUploadSupport.parseFileItems(CommonsFileUploadSupport.java:254)
	at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:166)
	at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:149)
	at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1015)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:851)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)


相关推荐

    多文件上传MultipartFile

    总结来说,`MultipartFile`是Spring框架处理多文件上传的核心工具,结合前端的文件选择和`webuploader`等库可以实现断点续传功能,提升用户体验。在后台处理文件时,通常需要先执行数据库操作,确保数据一致性,然后...

    Android上传单文件和多文件(后台使用MultipartFile)

    本知识点主要聚焦于如何在Android中实现单文件和多文件的上传,以及后台使用`MultipartFile`类进行处理的方式。`MultipartFile`是Spring框架中的一个接口,常用于处理HTTP请求中的多部分(multipart)数据,包括文件...

    MultipartFile上传图片(多图片上传)

    在Java开发中,MultipartFile是Spring框架提供的一种用于处理上传文件的接口,它使得开发者能够方便地接收HTTP请求中的多部分(Multipart)数据,其中包括图片的上传。在本场景下,我们将探讨如何实现多图片上传的功能...

    springMVC实现多文件上传需要的jar

    总结来说,实现Spring MVC的多文件上传需要结合Spring MVC的MultipartFile接口、Apache Commons的FileUpload库以及适当的配置和业务逻辑。理解这些知识点,你就可以构建一个稳定且灵活的多文件上传功能。注意在实际...

    基于nio实现的多文件上传源码

    本主题“基于nio实现的多文件上传源码”探讨的是如何利用Java NIO来实现高效的多文件上传功能,尤其对于小文件数量较大的情况。 首先,理解NIO的基本概念是必要的。NIO中的“非阻塞”意味着当数据不可用时,读写...

    java POI 通过MultipartFile删除Excel文件解析写入数据库

    在Web开发中,我们经常需要处理用户上传的文件,MultipartFile是Spring框架提供的一种处理文件上传的接口,它使得我们可以方便地接收和处理上传的Excel文件。下面我们将深入探讨如何使用Java POI和MultipartFile来...

    一次性选择多文件上传multiple属性

    在Java JSP环境中,处理多文件上传通常会涉及Servlet和MultipartFile接口。Spring框架提供了便捷的支持,可以使用`@RequestParam("files[]") MultipartFile[] files`来接收上传的文件数组。每个`MultipartFile`对象...

    okhttp多文件上传

    本知识点将详细介绍如何利用OkHttp实现多文件上传,并结合服务器端代码来理解整个流程。 一、OkHttp简介 OkHttp是由Square公司开发的一个HTTP客户端库,它提供了一个简单、高效且强大的接口来处理网络请求。OkHttp...

    详解SpringMVC使用MultipartFile实现文件的上传

    请注意,这只是一个基础的FTP上传示例,实际使用时可能需要处理更多细节,如错误处理、文件重命名、目录创建等。 综上所述,使用SpringMVC和`MultipartFile`可以方便地处理文件上传,而结合FTP服务则可以实现在本地...

    Java原生服务器接收上传文件 不使用MultipartFile类

    在本文中,将详细介绍如何在Java原生服务器中接收上传的文件,而不需要使用Spring框架中常用的MultipartFile类。这种情况通常出现在需要与现有上传组件兼容或解决与其他上传模块的冲突时。首先,将介绍如何通过注释...

    Java利用MultipartFile实现上传多份文件的代码

    Java 利用 MultipartFile 实现上传多份文件的代码 Java 中实现上传多份文件的代码是非常实用的技术,以下是关于 MultipartFile 的知识点: MultipartFile 概念 MultipartFile 是 Spring 框架中提供的一个接口,...

    使用httpPost实现文件上传转发

    使用httpPost java实现文件上传转发。 使用MultipartFile[] files,@RequestParam Map,Object&gt; map 接收

    多文件上传例子(解决中文乱码)

    多文件上传例子,彻底解决中文乱码问题了。总结中文乱码问题如下: 1、所有页面都用UTF-8。 2、写过滤器,设置request.setCharacterEncoding("UTF-8")。 3、javascript脚本里用encodeURI(str)。 4、适当的时候,在...

    Spring MultipartFile 文件上传【注解】& JQuery uploader plugin

    Spring `MultipartFile` 是Spring MVC框架为处理HTTP多部分请求(即文件上传)而设计的一个接口。它允许开发者在后端服务中接收、处理和存储上传的文件。通过注解驱动的方式,我们可以非常便捷地在控制器方法中处理...

    android 文件上传(多个或单个),图片上传

    本文将深入探讨如何实现Android平台上的多文件和单文件上传,以及图片上传的实现细节。 ### 1. 文件上传基础 #### 1.1 获取文件 在Android中,用户可以选择文件,通常通过Intent的ACTION_PICK或者ACTION_GET_...

    springmvc ajax 文件上传下载文件 multiple

    - 为了处理多文件上传,需要将`&lt;input type="file"&gt;`改为`&lt;input type="file" multiple&gt;`,允许用户选择多个文件。 - 配置Spring MVC的`CommonsMultipartResolver`解析器以支持文件上传,需要在`web.xml`或Spring...

    SpringMVC 上传文件 MultipartFile 转为 File的方法

    在SpringMVC框架中,处理文件上传通常涉及`MultipartFile`接口,它是Spring提供的一个用于处理上传文件的数据类型。当用户通过HTTP请求上传文件时,SpringMVC会将这些文件封装成`MultipartFile`对象。然而,在实际...

    File 转 MultipartFile 和MultipartFile的maven配置

    在Java Web开发中,我们经常会遇到需要处理上传文件的情况,其中`MultipartFile`是Spring MVC框架提供的一种用于处理文件上传的接口。然而,在实际操作中,我们可能需要将已有的`File`对象转换为`MultipartFile`,...

    SpringMVC文件上传,多文件上传实例

    在这个“SpringMVC文件上传,多文件上传实例”中,我们将深入探讨如何在SpringMVC环境中实现文件上传功能,包括单个文件上传以及多个文件的批量上传。 1. **文件上传原理**: 文件上传是通过HTTP协议的POST请求来...

    多文件上传,并显示每一个的进度

    1. **SpringMVC的文件上传处理**:在Controller层,我们可以定义一个方法,接收`MultipartFile[] files`参数,这样就可以处理多文件上传。每个`MultipartFile`对象代表一个上传的文件,可以获取文件名、类型、大小等...

Global site tag (gtag.js) - Google Analytics