在Spring MVC框架下利用Servlet3.0 API实现文件上传
2017-06-08 13:48
344 查看
Servlet3.0提供了对文件上传的原生支持,不需借助任何第三方组件,直接使用Servlet3.0提供的API就能够实现文件上传功能。本文使用IDEA IDE工具,在Spring MVC框架下,基于注解映射和数据绑定编写Java业务代码,利用Servlet3.0 API来实现单个文件的上传示例。
添加原因:Spring MVC无法直接对Servlet进行注解。另一种方法是用@Multipart
c4e7
Config给DispatcherServlet进行注解,效果一样。
2.若表单post提交的multipartFile数据无法绑定到后台对应属性,可能是表单配置不对enctype=”multipart/form-data”。
部署配置文件
MultipartConfig Servlet
在部署描述符中的DispatcherServlet中声明赋值,使其Servlet变成MultipartConfig Servlet,具体添加以下标签内容://web.xml <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> <multipart-config> <max-file-size>1000000</max-file-size> </multipart-config> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
添加原因:Spring MVC无法直接对Servlet进行注解。另一种方法是用@Multipart
c4e7
Config给DispatcherServlet进行注解,效果一样。
MultipartResolver
在Spring MVC配置文件中添加一个不同的多部分解析器,具体添加以下内容://springmvc.servlet.xml <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"> </bean>
编写Java代码
Domain类
/** * UploadFile.java * * @author Zero */ public class UploadFile implements Serializable { private static final long serialVersionUID = 123456789L; private MultipartFile multipartFile; private String description; public static long getSerialVersionUID() { return serialVersionUID; } public MultipartFile getMultipartFile() { return multipartFile; } public void setMultipartFile(MultipartFile multipartFile) { this.multipartFile = multipartFile; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
Service接口与实现类
/** * MyFileService.java * * @author Zero */ public interface MyFileService { //MyFileDto loadFileByGuid(String guid); String uploadFile(UploadFile uploadFile, String realPath); } //MyFileServiceImpl.java @Service("myFileService") public class MyFileServiceImpl implements MyFileService { private static final String UPLOAD_ERROR = "文件上传出错!"; private static final String UPLOAD_SUCCESS = "文件上传成功!"; @Override public String uploadFile(UploadFile uploadFile, String realPath) { boolean loadFileVerify = false; MultipartFile multipartFile = uploadFile.getMultipartFile(); String fileName = multipartFile.getOriginalFilename(); File file = new File(realPath, fileName); try { multipartFile.transferTo(file); loadFileVerify = true; } catch (IOException e) { e.printStackTrace(); } return loadFileVerify ? UPLOAD_SUCCESS : UPLOAD_ERROR; } }
Controller类
/** * MyFileController.java * * @author Zero */ @Controller @RequestMapping("/public/") public class MyFileController { private static Logger LOG = LoggerFactory.getLogger(FileController.class); private static final String UPLOAD_EMPTY = "文件为空!"; @Autowired private MyFileService fileService; @RequestMapping(value = "file_upload", method = RequestMethod.POST) public String upload(@ModelAttribute(uploadFile) @Valid UploadFile uploadFile, BindingResult result, HttpServletRequest request, Model model) { if (result.hasErrors()) { LOG.warn(UPLOAD_EMPTY); model.addAttribute("uploadResult", UPLOAD_EMPTY); return "index"; } String uploadResult = fileService.uploadFile(uploadFile, request.getServletContext().getRealPath("/file")); model.addAttribute("uploadResult", uploadResult); return "index"; } }
编写前端页面代码
编写JSP测试表单
//index.jsp <form action="public/file_upload" method="post" enctype="multipart/form-data"> <h4>File Upload</h4> <div class="form-group"> <label for="multipartFile">File select:</label> <input type="file" name="multipartFile" id="multipartFile"/> </div> <div class="form-group"> <label for="description">File description:</label> <input type="text" name="description" id="description"/> </div> <div class="form-group"> <input type="submit" value="upload"/> <p >${uploadResult}</p> </div> </form>
注意事项
1.若BindingResult返回false,可能是domain类参数匹配不对,特别是serialVersionUID,需用idea自生成;2.若表单post提交的multipartFile数据无法绑定到后台对应属性,可能是表单配置不对enctype=”multipart/form-data”。
相关文章推荐
- Servlet 3.0改进的API 实现文件上传
- 利用HTML5+的API实现基于MUI的文件上传
- Spring MVC 4使用Servlet 3 MultiPartConfigElement实现文件上传(带源码)
- 基于Servlet3.0+注解开发实现文件上传
- jsp+servlet实现文件上传(不使用任何组件和框架)
- 在struts1.1框架下,利用smartupload实现文件的上传(可以是多个文件)
- 文件的上传-servlet实现文件上传---核心API—DiskFileItemFactory
- Servlet利用Commons FileUpload实现文件上传
- servlet利用fileupload实现文件上传
- Servlet3.0实现文件上传的方法
- servlet3.0 实现文件的上传
- 在struts1.1框架下,利用smartupload实现文件的上传(可以是多个文件)
- 【Servlet】利用Servlet3.0标准与JSTL表达式实现文件上传系统,支持图片上传后显示
- Android 利用an框架快速实现网络请求(含下载上传文件)
- spring mvc 3.0 实现文件上传功能
- 利用反射实现一个Java文件书写多个Servlet,无框架
- servlet3.0 Part接口实现form表单文件上传
- 利用commons-fileupload在servlet中实现文件上传
- 利用resteasy框架构建rest webservice----第三波:实现文件上传---非form提交方式(实例、教程)
- [笔记-架构探险]框架优化与功能扩展3.1.优化Action参数、提供文件上传功能、与ServletApi解耦.