基于Spring3 MVC实现基于HTML form表单文件上传

简介: 基于Spring3 MVC实现基于HTML form表单文件上传

基于Spring3 MVC实现基于form表单文件上传


一:杂项准备


环境搭建参考这里-http://blog.csdn.net/jia20003/article/details/8471169


二:前台页面


根据RFC1867,只要在提交form表单中声明提交方法为POST,enctype属


性声明为multipart/form-data, action声明到要提交的url即可。具体如下:

1357470742_8718.png



三:spring配置


使用spring3的MultipartHttpReqest来接受来自浏览器的发送的文件内容。


需要配Multipart解析器在express-servlet.xml中。内容如下:

1357470770_2552.png



同时还需要在maven的pom.xml文件添加apachefileupload与common-io两个包。


1357470796_6012.png


四:Controller中方法实现

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public ModelAndView getUploadFile(HttpServletRequest request, HttpServletResponse response) {
  System.out.println("fucking spring3 MVC upload file with Multipart form");
  String myappPath = request.getSession().getServletContext().getRealPath("/");
  try {
    if (request instanceof MultipartHttpServletRequest) {
      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
      System.out.println("fucking spring3 MVC upload file with Multipart form");
      // String myappPath = multipartRequest.getServletContext().getRealPath("/"); 
      // does not work, oh my god!!
      MultipartFile file = multipartRequest.getFiles("userfile1").get(0);
      long size = file.getSize();
      byte[] data = new byte[(int) size];
      InputStream input = file.getInputStream();
      input.read(data);
      
      // create file, if no app context path, will throws access denied.
      // seems like you could not create any file at tomcat/bin directory!!!
      File outFile = new File(myappPath + File.separator + file.getOriginalFilename());
      if(!outFile.exists()) {
        outFile.createNewFile();
        System.out.println("full path = " + outFile.getAbsolutePath());
      } else {
        System.out.println("full path = " + outFile.getAbsolutePath());
      }
      FileOutputStream outStream = new FileOutputStream(outFile);
      
      outStream.write(data);
      outStream.close();
      input.close();
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
 
  return new ModelAndView("welcome");
}

常见问题:


1. java.io.IOException: Access is denied避免这个错误是把文件创建在app


context path的下面所以要获取servlet context的本地路径。


2. Request类型不是MultipartHttpReqest类型,原因是没有配置spring的Multipart解析器


Chrome中运行截屏:

1357471347_1534.png



转载请注明

相关文章
|
移动开发 HTML5
HTML5 表单属性3
`<input>` 标签的 `formaction`、`formenctype` 和 `formmethod` 属性分别用于指定表单提交的 URL 地址、数据编码类型和提交方法,这些属性可覆盖 `<form>` 标签中的相应属性,并且主要适用于 `type="submit"` 和 `type="image"` 的输入类型。
|
移动开发 JavaScript 前端开发
HTML5 表单属性7
`pattern` 属性使用正则表达式验证 `<input>` 元素的值,适用于 `text`, `search`, `url`, `tel`, `email`, 和 `password` 类型。
|
移动开发 UED HTML5
HTML5 表单属性6
`min`、`max` 和 `step` 属性用于限制 `<input>` 标签中的数值或日期范围。例如,可以设置日期选择器的最早和最晚日期,或限制数字输入框的值范围。`multiple` 属性允许在 `<input>` 中选择多个值,适用于邮箱和文件类型。这些属性增强了表单控件的功能性和用户体验。
|
移动开发 HTML5
HTML5 表单属性4
`formnovalidate` 属性是一个布尔属性,用于 `<input>` 元素,指示该输入在表单提交时不需验证,可覆盖 `<form>` 元素的 `novalidate` 属性,常与 `type="submit"` 一起使用。示例中展示了如何通过两个提交按钮(一个使用验证,另一个不使用)实现不同的表单提交方式。
|
移动开发 HTML5
HTML5 表单属性5
`height` 和 `width` 属性用于 `<input>` 标签中的 `image` 类型,定义图像的高度和宽度。
|
移动开发 JavaScript 前端开发
HTML5 表单属性2
`novalidate` 是 HTML `<form>` 元素的布尔属性,用于禁用浏览器的默认表单验证功能。当此属性存在时,浏览器不会检查表单字段是否符合预设的验证规则,允许开发者通过 JavaScript 等手段自定义验证逻辑。
|
移动开发 数据安全/隐私保护 HTML5
HTML5 表单属性8
`required`属性确保表单提交前输入框不能为空,适用于多种类型的 `<input>` 标签,如文本、邮箱、密码等。`step`属性则用于指定输入域中合法数值的间隔,常与`max`和`min`属性配合使用,适用于数字、日期等类型。例如,设置`<input type="number" step="3">`可使输入值以3为单位递增或递减。
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
285 0
|
存储 设计模式 前端开发
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
文章解释了SpringMVC的概念和各部分功能,探讨了应用分层的原因和具体实施的三层架构,以及SpringMVC与三层架构之间的关系和联系。
930 1
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
|
安全 前端开发 Java
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
309 1