转载地址:https://www.cnblogs.com/lunaticcoder/p/9813483.html(具体的看这个这个大佬的博客)
依赖包:
<!-- 上传文件依赖组件 -->
<!-- 这两个依赖要一起使用-->
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency>
前端在提交的时候也需要修改.form表单提交默认是application/x-www-form-urlencoded而上传文件把文件用2进制的方式传输,默认的格式已经满足不了需求,就需要使用multipart/form-data格式来发送接收。
1. 在form中加入 enctype="multipart/form-data"
1 <form action="admin/upload_theme.do" method="post" enctype="multipart/form-data"> 2 <input type="file" name="meFile" /><p> 3 <input type="submit" value="提交" /><p> 4 <input type="reset" value="清空" /><p> 5 </form>
2.上传多文件的话,需在表单的input中加入multiple="multiple"。(可一次选择多个文件)
1 <form action="admin/upload_theme.do" method="post" enctype="multipart/form-data"> 2 <input type="file" name="meFile" multiple="multiple" /><p> 3 <input type="submit" value="提交" /><p> 4 <input type="reset" value="清空" /><p> 5 </form>
3.上传文件夹的话,需在表单input中加入webkitdirectory directory。(仅可以选择文件夹,文件夹内的文件也能成功上传)
1 <form action="admin/upload_theme.do" method="post" enctype="multipart/form-data"> 2 <input type="file" name="meFile" multiple="multiple" webkitdirectory directory /><p> 3 <input type="submit" value="提交" /><p> 4 <input type="reset" value="清空" /><p> 5 </form>
后端代码
单文件上传
1 @RequestMapping("/upload_theme.do")//上传主题 2 public String UploadTheme(MultipartFile meFile,Model model){ 3 if (meFile != null) { 4 System.out.println(meFile.getContentType());//在控制台打印文件的类型 5 System.out.println(meFile.getName());//返回文件的名称 6 System.out.println(meFile.getOriginalFilename());//返回文件的原文件名 7 try { 8 meFile.transferTo(new File("G:/temp/"+UUID.randomUUID()+meFile.getOriginalFilename())); 9 } catch (IllegalStateException e) { 10 e.printStackTrace(); 11 model.addAttribute("msg", "上传失败"); 12 return "/error.jsp"; 13 } catch (IOException e) { 14 e.printStackTrace(); 15 model.addAttribute("msg", "上传失败"); 16 return "/error.jsp"; 17 } 18 } 19 model.addAttribute("msg", "上传成功"); 20 return "index"; 21 }
多文件上传
1 @RequestMapping("/upload_theme.do")//上传主题 2 public String UploadTheme(HttpServletRequest request,Model model){ 3 CommonsMultipartResolver cResolver = new CommonsMultipartResolver(); 4 if (cResolver.isMultipart(request)) {//判断是不是Multipart格式的数据 5 MultipartHttpServletRequest httpservletrequest = (MultipartHttpServletRequest) request;//将文件格式的请求装入MultipartHttpServletRequest对象中。 6 List<MultipartFile> list = httpservletrequest.getFiles("meFile");//通过调用该方法取出文件到list 7 for (int i = 0; i < list.size(); i++) { 8 System.out.println(list.get(i).getOriginalFilename()); 9 System.out.println(list.get(i).getContentType()); 10 try { 11 list.get(i).transferTo(new File("G:/temp/"+UUID.randomUUID()+list.get(i).getOriginalFilename())); 12 } catch (IllegalStateException e) { 13 e.printStackTrace(); 14 model.addAttribute("msg", "上传失败"); 15 return "/error.jsp"; 16 } catch (IOException e) { 17 e.printStackTrace(); 18 model.addAttribute("msg", "上传失败"); 19 return "/error.jsp"; 20 } 21 } 22 } 23 model.addAttribute("msg", "上传成功"); 24 25 return "index"; 26 }
Spring的xml文件配置如下
1 <!-- Spring MVC --> 2 3 <!-- 配置组件扫描 --> 4 <context:component-scan 5 base-package="export.controller" /> 6 7 <!-- 配置ViewResolver --> 8 <bean 9 class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 10 <property name="prefix" 11 value="/web/" /> 12 <property name="suffix" 13 value=".jsp" /> 14 </bean> 15 <bean id="multipartResolver" 16 class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 17 <!-- 上传文件大小上限,单位为字节(10MB) --> 18 <property name="maxUploadSize"> 19 <value>10485760</value> 20 </property> 21 <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --> 22 <property name="defaultEncoding"> 23 <value>UTF-8</value> 24 </property> 25 </bean> 26 <!-- 注解驱动 --> 27 <mvc:annotation-driven />
以及MultipartFile对象中的常用方法如下:
byte[] getBytes():获取文件数据
String getContentType[]:获取文件MIME类型,如image/jpeg等
InputStream getInputStream():获取文件流
String getName():获取表单中文件组件的名字
String getOriginalFilename():获取上传文件的原名
Long getSize():获取文件的字节大小,单位为byte
boolean isEmpty():是否有上传文件
void transferTo(File dest):将上传文件保存到一个目录文件中
非常感谢@花裤都派大星 原谅我转载了你的帖子
也可以看看这些博客:https://blog.csdn.net/qian_ch/article/details/69258465
https://www.cnblogs.com/WJ-163/p/6269409.html