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

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

一:杂项准备

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

二:前台页面

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

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

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

三:spring配置

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

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

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

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

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

四: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中运行截屏:

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

转载请注明

上一篇:Unity5 的新旧延迟渲染Deferred Lighting Rendering Path


下一篇:滚动数组