工作中遇到使用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(); } } } }
代码片是不是炸了,怎么都引用不出。。。