Neeke

伪全栈攻城狮

Spring MVC 文件上传

突然之间很痛恨那些用采集程序做的垃圾站,遇到个问题搜索一下出来几百个网页,打开一个看看解决方案,看半天最后还是对不上号,再看下一个,晕!和前面的文章一样,再换还是一样...本来人就挺急的,打开一个重复的,打开一个重复的,标题不一样,内容全一样,FUCK!最后没办法,问题翻译成英文(都是程序上的问题,基本上不需要翻译。)去国外的网站上去找,找到了。 入正题。UI上用ExtJS,后台使用Spring的SimpleFormController进行数据处理。 Controller数据处理部分代码:
protected ModelAndView onSubmit(HttpServletRequest request,
		HttpServletResponse response, Object command, BindException errors)
		throws Exception {

	response.setContentType("text/html;charset=UTF-8");
	Plans plan = (Plans)command;
	CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
	commonsMultipartResolver.setDefaultEncoding("utf-8");
	if(commonsMultipartResolver.isMultipart(request))
	{
		MultipartHttpServletRequest multipartRequest = commonsMultipartResolver.resolveMultipart(request);
		MultipartFile ffile = multipartRequest.getFile("planFile");
		if(ffile != null){
			File tfile = new File("d:\\"+ffile.getOriginalFilename());
			ffile.transferTo(tfile);
		}
	 }
	this.planService.savePlan(plan);
	response.getWriter().write("{'success':true,'msg':'新建协同计划成功'}");
	return null;
}
当把FormPanel的fileUpload置为true时,文件被写入D盘,但是command对象中没有表单中的数据,反之则command封装了表单数据可文件无法上传(废话!- -!)。起初以为是FileUploadField.js这个扩展的问题,但不是。 查资料说是要在配置文件中加入如下配置启用CommonsMultipartResolver即可解决。

	
		3455340
	
	
		utf-8
	

可加完后我感觉想哭,command中有数据了,但是文件又传不上去了(文章作者还说经过测试成功)。再查... 当加了上面的配置后,Spring会自动将onSubmit()方法中的HttpServletRequest转为MultipartHttpServletRequest,onSubmit()中加了句 System.out.println(request instanceof MultipartHttpServletRequest); 输出true,应该没错了。 重新修改onSubmit()方法如下:
protected ModelAndView onSubmit(HttpServletRequest request,
		HttpServletResponse response, Object command, BindException errors)
		throws Exception {

	response.setContentType("text/html;charset=UTF-8");
	Plans plan = (Plans)command;
	MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
	MultipartFile ffile = multipartRequest.getFile("planFile");
	if(ffile != null){
		
		String ffileName = ffile.getOriginalFilename();
		String tfileName = UUID.randomUUID().toString()+ffileName.substring(ffileName.lastIndexOf('.'), ffileName.length());
		File tfile = new File(request.getSession().getServletContext().getRealPath("")+"\\upload\\"+tfileName);
		ffile.transferTo(tfile);
		plan.setSdocname(ffileName);
		plan.setTdocname(tfileName);
	}
	this.planService.savePlan(plan);
	response.getWriter().write("{'success':true,'msg':'新建协同计划成功'}");
	return null;
}
搞定。
  • 评论列表:
  •  a2234
     发布于 2009-12-23 15:56:12  回复该评论
  • 可以提供例子下载吗?我弄来弄去都不成功。
    •  neeke
       发布于 2009-12-24 11:12:43  回复该评论
    • 答案都有了,还要例子呀? n:-tt

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«   2017年8月   »
123456
78910111213
14151617181920
21222324252627
28293031
网站分类
搜索
控制面板
您好,欢迎到访网站!
  查看权限
最新留言
文章归档
友情链接

Powered By Z-BlogPHP 1.5.1 Zero

Copyright Your WebSite.Some Rights Reserved.