springMVC之单文件上传

springmvc对form表单的支持已经很成熟,仅仅两步:

  1. 配置支持文件上传的bean:org.springframework.web.multipart.commons.CommonsMultipartResolver

      同时设置文件编码、单次提交表单上传文件最大字节数、以及写文件时使用的缓冲区大小
  2. 开发处理:handler[org.hy.ssm.web.controller.FormController.uploadOne(MultipartFile)]
     

    Java代码  

    1. /**
    2. * @Title: uploadOne
    3. * @Description: 单文件上传
    4. * @param file
    5. * @return ModelMap
    6. */
    7. @RequestMapping("/uploadOne")
    8. @ResponseBody
    9. public ModelMap uploadOne(MultipartFile file) {
    10. final String UPLOAD_DIR = "/upload/";
    11. final String KEY_OF_ORIGINAL_FILE_NAME = "origFileName";
    12. final String KEY_OF_FILE_URL = "fileUrl";
    13. final String KEY_OF_FILE_SUFFIX = "fileSuffix";
    14. boolean flag = false;
    15. String message = null;
    16. Map<String, String> data = Maps.newHashMap();
    17. // 原文件名(通常用于下载展示)
    18. String originalFilename = file.getOriginalFilename();
    19. data.put(KEY_OF_ORIGINAL_FILE_NAME, originalFilename);
    20. // 文件类型(后缀)
    21. String suffix = FileUtil.getSuffix(originalFilename);
    22. data.put(KEY_OF_FILE_SUFFIX, suffix);
    23. // 目标文件名(通常情况需要重命名, 防止同名文件覆盖)
    24. String fileName = String.valueOf(System.currentTimeMillis()) + suffix;
    25. String fileUrl = (UPLOAD_DIR + fileName);
    26. data.put(KEY_OF_FILE_URL, fileUrl);
    27. try {
    28. File dest = WebUtil.getFile(fileUrl);
    29. file.transferTo(dest);
    30. flag = true;
    31. } catch (Exception e) {
    32. flag = false;
    33. message = "";
    34. LOGGER.warn(message + " : " + e.getMessage(), e);
    35. }
    36. return WebUtil.getModelMap(flag, data, message);
    37. }

接下来验证结果是否正确:

  • 正常验证

     
  • 非法验证,文件大小超出。当前测试数据70+MB

    Java代码  

    1. org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 32505856 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (79882924) exceeds the configured maximum (32505856)
    2. at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:160)
    3. at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139)
    4. at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1020)
    5. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:883)
    6. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    7. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    8. at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    9. at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    10. at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    11. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    12. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    13. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    14. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    15. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    16. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    17. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    18. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    19. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    20. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    21. at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    22. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    23. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
    24. at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
    25. at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    26. at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    27. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    28. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    29. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    30. at java.lang.Thread.run(Thread.java:722)
    31. Caused by: org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (79882924) exceeds the configured maximum (32505856)
    32. at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:937)
    33. at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
    34. at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351)
    35. at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
    36. at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156)
    37. ... 28 more

    由错误也可定位出,#multipartResolver.maxUploadSize 是用来定位单次表单提交时,文件的限定大小

到此,单文件上传已经搞定。是不是很简单呢?当然了还有稍微原始的方法,通过 org.apache.commons.fileupload.servlet.ServletFileUpload 也能实现文件上传的功能,在此不做详解。大致步骤如下:

  1. 获取工厂 DiskFileItemFactory
  2. 通过工厂获取上传组件 ServletFileUpload
  3. 解析请求获取表单项
  4. 判断表单项类型
  5. 解析表单项

Java代码  

  1. /**
  2. * @Title: uploadByFileUpload
  3. * @Description: 使用Commons.FileUpload上传文件
  4. */
  5. @RequestMapping("/uploadByFileUpload")
  6. public void uploadByFileUpload() {
  7. final String UPLOAD_DIR = "upload/";
  8. final String basePath = WebUtil.getBaseFilPath();
  9. HttpServletRequest request = WebUtil.getRequest();
  10. try {
  11. // 防止中文名乱码
  12. request.setCharacterEncoding("utf-8");
  13. // 1. 获取工厂 DiskFileItemFactory
  14. DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
  15. // 缓存区目录
  16. fileItemFactory.setRepository(new File(basePath + "tmp/"));
  17. // 缓存区大小
  18. fileItemFactory.setSizeThreshold(1024 * 6);
  19. // 2. 通过工厂获取上传组件 ServletFileUpload
  20. ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
  21. // 设置文件的大小为2M
  22. servletFileUpload.setSizeMax(1024 * 1024 * 2);
  23. // 防止中文乱码(文件名)
  24. servletFileUpload.setHeaderEncoding("UTF-8");
  25. // 3. 解析请求获取表单项
  26. @SuppressWarnings("unchecked")
  27. List<FileItem> items = servletFileUpload.parseRequest(request);
  28. // 4. 判断表单项类型
  29. for (FileItem item : items) {
  30. // 5. 解析表单项
  31. // 表单项名称
  32. String fieldName = item.getFieldName();
  33. if (item.isFormField()) {
  34. // 普通表单项处理
  35. String name = fieldName;
  36. String value = item.getString("UTF-8");
  37. System.out.println(name + ":" + value);
  38. } else {
  39. // 文件表单项
  40. // 获取文件名
  41. String originalFileName = item.getName();
  42. String suffix = FileUtil.getSuffix(originalFileName);
  43. String newFileName = String.valueOf(System.currentTimeMillis());
  44. // 写入文件
  45. String fileName = File.separator + newFileName + suffix;
  46. File newFile = FileUtil.createQuietly(basePath + UPLOAD_DIR + fileName);
  47. item.write(newFile);
  48. item.delete();
  49. }
  50. }
  51. } catch (Exception e) {
  52. LOGGER.warn(e.getMessage(), e);
  53. }
  54. }

注意:如果使用上面的方式获取上传文件,需要停止 springmvc 的文件解析机制,否则将不能获取数据 !!



 

源码下载:ssmFU.zip

时间: 2024-08-03 19:27:54

springMVC之单文件上传的相关文章

SpringMVC实现单文件上传、多文件上传、文件列表显示、文件下载

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+standard.jar 整个相关的包如下: 整个工程目录如下: 二.配置web.xml和SpringMVC文件

springmvc的单文件上传

@RequestMapping("/up") public ModelAndView up(MultipartFile myfiles , HttpServletRequest request){ ModelAndView model = new ModelAndView(); String result = savePic(request, myfiles); //调用保存的方法 if(!StringUtils.isEmpty(result)){ --非必要代码 System.out

SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程免费下载 一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+standard.jar 整个相关的包如下: 整个工程目录如下: 二.配置web.xml和Spr

springMVC数据校验与单文件上传

spring表单标签:    <fr:from/> 渲染表单元素    <fr:input/>输入框组件    <fr:password/>密码框组件标签    <fr:hidden/>隐藏框组件标签0    <fr:textarea/>多行输入框组件标签    <fr:radiobutton/>单选框组件标签    <fr:checkbox/>复选框组件标签    <fr:select/>下拉列表组件标签 

SpringMVC使用MultipartFile文件上传,多文件上传,带参数上传

一.配置SpringMVC 在spring.xml中配置: <!-- springmvc文件上传需要配置的节点--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="-1&

SpringMvc入门五----文件上传

? 知识点: SpringMvc单文件上传 SpringMvc多文件上传 ? 这里我直接演示多文件上传,单文件的上传就不说了,不过代码都是现成的. 效果预览: ? DEMO图: ? ? 添加文件上传jar包: Web.xml配置文件:添加spring Servlet ????<servlet> ????????<servlet-name>springmvc</servlet-name> ????????<servlet-class>org.springfra

SpringMVC高速实现文件上传功能

SpringMVC为我们封装了上传文件的功能,如今就试用一下 须要的jar包 我用的是Maven项目,就不须要到处下载Jar包了 SpringMVC的搭建 首先要在applicationContext配置文件中注冊一下文件上传的服务 如 <!-- 文件上传配置--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartRes

表单文件上传与文件下载

一.简介 使用form表单进行需要为form添加enctype="multipart/form-data" 属性,除此之外还需要将表单的提交方法改成post,如下 method="post". 二.示例 1.表单文件上传 网页代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 </head> 5 <body> 6 <form action="${pageC

【springMVC】之文件上传

通过前两篇博客的学习,想必大家对springMVC已经有了一个基本的认识.今天我们主要来学习一下springMVC两种文件上传的方式. 首先介绍第一种,通过字节流的方式实现文件上传.首先创建一个upload.jsp页面 <body> <h>添加用户</h> <!-- entype要声音和支撑这种类型的,保证文件上传不会被解码--> <!-- form表单,action是说讲这个表单提交到什么路径: method="post"是提交方