【工作笔记】Spring mvc多文件上传

工作中遇到使用SpringMvc的文件上传,记录一下以备今后使用。


首先需要在SpringMvc的配置文件中配置:

   
     

   
   
   
   
   
   


form标签中要加上一个属性:

<form enctype="multipart/form-data" ></form>

input标签里的name设成file。(有待验证)


第一次见到这个属性,一脸蒙蔽的查了下定义:

enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。

默认地,表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。


然后,java代码是酱紫滴:

@RequestMapping(value = "/upload")
public String upload(HttpServletRequest request) {
		
	// 将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
	CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
	
	// 检查form中是否有enctype="multipart/form-data"
	if (multipartResolver.isMultipart(request)) {
	
		// 将request变成多部分request
		MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
		
		// 获取multiRequest 中所有的文件名
		Iterator iter = multiRequest.getFileNames();

		while (iter.hasNext()) {
			// 一次遍历所有文件
			MultipartFile file = multiRequest.getFile(iter.next().toString());
			String filename = file.getOriginalFilename(); // 文件名称
        
            if(filename.length() != 0) {
                String filePath = "C:/";
                file.transferTo(new File(filePath));
            }
        }
    }
}

会抛出IOException, IllegalStateException这两个异常,为了让大家看得方便就不使用try catch了。

--------------------------2017.1.19补充--------------------------------------
这个东西做多文件上传没问题,可是同时上传几个文件就需要几个input,现在怎么可能还放着一堆input让你传文件呢。。
更多的是使用js框架,如果使用js框架,只能传一个文件(最新项目中用了 DropzoneJS),app端更别提input框了。

不过在本猿在一通百度+查看接口文档后终于搞定了。

if (multipartResolver.isMultipart(request)) {
		
			// 将request变成多部分request
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
			MultiValueMap<String, MultipartFile> m = multiRequest.getMultiFileMap();
			
			if(m == null || m.size() == 0) {
				return new HashMap<String, List<String>>();
			}
			Iterator iterator = m.entrySet().iterator();

			// 一次遍历所有文件
			Entry entry = (Entry) iterator.next();
			List<MultipartFile> files =  (List<MultipartFile>) entry.getValue();
			for(MultipartFile f : files) {
				String filename = f.getOriginalFilename(); // 文件名称
				String prefix = filename.substring(filename.lastIndexOf(".")); // 文件后缀
				String name = filename.substring(0,filename.lastIndexOf(".")); // 文件名
				
	            if(filename.length() != 0) {
	            	accessoryName.add(filename);
	            	
	            	filename = UUID.randomUUID() + version + prefix;
	            	
					//此路径是将附件保存到指定ip下 放到外网 就能使用户访问到
	            	String filePath = localPath + Constants.NACCESSORY_FILE + userId;
	            	//如果没有路径,就创建路径
	            	File uploadDir = new File(filePath);
	            	if(!uploadDir.exists() && !uploadDir.isDirectory()){
						uploadDir.mkdirs();
					}
	            	filePath = filePath + "/" + filename;
	            	accessoryStr.add(Constants.NACCESSORY_FILE + userId + "/" + filename );
	            	
	                try {
						f.transferTo(new File(filePath));
					} catch (IllegalStateException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
	            }
	        }
	    }


代码片是不是炸了,怎么都引用不出。。。




猜你喜欢

转载自blog.csdn.net/qq_28298683/article/details/53521669