`
步青龙
  • 浏览: 299060 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
72ba33fb-eefe-3de1-bd65-82a6e579265d
Java面试
浏览量:0
社区版块
存档分类
最新评论

spring mvc那些破事儿

 
阅读更多

 

1:使用SpringMVC 实现批量上传

报错:**.SecurityContextHolderAwareRequestWrapper can not be cast to **.DefaultMultipartHttpServletRequest

使用springmvc上传要加上

 

<bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”>
	<property name="maxUploadSize" value="400000" />
</bean>

Action处理

 

@RequestMapping(value = "/upload.htm")
	public static void uploadmutiFiles(HttpServletRequest req,
			HttpServletResponse res, ModelAndView model) {
		String path = req.getSession().getServletContext()
				.getRealPath("/upload/"); // 获取本地存储路径
		MultipartHttpServletRequest mul = (MultipartHttpServletRequest) req;
		List<MultipartFile> files = mul.getFiles("file");
		String msg = "上传成功";
		try {
			for (int i = 0; i < files.size(); i++) {
				CommonsMultipartFile mf = (CommonsMultipartFile) files.get(i);
				File file = new File(path + "/" + mf.getOriginalFilename());
				int index = mf.getOriginalFilename().lastIndexOf(".");
				String filename = mf.getOriginalFilename().substring(0, index);
				String extendname = mf.getOriginalFilename().substring(index);
				int ex = 1;
				while (file.exists()) {
					file = new File(path + "/" + filename + "(" + ex + ")" + extendname);
					ex++;
				}
				mf.getFileItem().write(file);
			}
		} catch (Exception e) {
			msg = "上传失败";
			e.printStackTrace();
		}
		try {
			res.getWriter().print(msg);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

2  but   kindeditor 编辑器就不可用了,因为编辑器用的一般的上传,spring mvc上传的话request 就不是一般性的http协议请求,而编辑器用的是普通http协议传输的HttpServletRequest,如果用编辑器默认的上传代码,这样的话报错会反过来,会自动的转换成MultipartHttpServletRequest,转换报错.

 

  解决办法: 去掉那<bean>配置,修改上传方法,注意表单中file的name属性值与mul.getFiles("xxx");  一一对应

,否则文件无法获取

 

	public static void uploadmutiFiles(HttpServletRequest request,
			HttpServletResponse res, ModelAndView model) {
		CommonsMultipartResolver commonsMultipartResolver = new   
			CommonsMultipartResolver(request.getSession().getServletContext());  
		commonsMultipartResolver.setDefaultEncoding("utf-8");  
		String path = request.getSession().getServletContext().getRealPath("/upload/"); // 获取本地存储路径
		String msg = "上传成功";
		try {
			if (commonsMultipartResolver.isMultipart(request)){
				MultipartHttpServletRequest mul =  commonsMultipartResolver.resolveMultipart(request);  
				List<MultipartFile> files = mul.getFiles("file"); // 这里可以用mul.getParamter("xxxx");
				for (int i = 0; i < files.size(); i++) {
					CommonsMultipartFile mf = (CommonsMultipartFile) files.get(i);
					File file = new File(path + "/" + mf.getOriginalFilename());
					int index = mf.getOriginalFilename().lastIndexOf(".");
					String filename = mf.getOriginalFilename().substring(0, index);
					String extendname = mf.getOriginalFilename().substring(index);
					int ex = 1;
					while (file.exists()) {
						file = new File(path + "/" + filename + "(" + ex + ")" + extendname);
						ex++;
					}
					mf.getFileItem().write(file);
				}
			} 
		} catch (Exception e) {
			msg = "上传失败";
			e.printStackTrace();
		}
		try {
			res.getWriter().print(msg);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

   问题搞定,而且和任何编辑器没任何挂噶。

3 but 一般上传form需要加上enctype="multipart/form-data",但是DTO无法获取了,参考文

   解决办法:spring mvc 多个配置 默认的web-main.xml 不加

 

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize" value="1048576" />
            <property name="defaultEncoding" value="utf8" />
 </bean>

 而利用spring mvc上传文件的配置中(名字随意 如web-main-image.xml )加上它,其他的配置属性相同。

 

web.xml 配置上传的分发器,指定springmvc 配置文件位置

 

	<servlet>
		<servlet-name>springServletImage</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>WEB-INF/config/spring/web/web-main-image.xml</param-value>
		</init-param>
		<load-on-startup>2</load-on-startup>
	</servlet>

 

 不过重复的配置很烦人,web-main-image.xml 可以就把multipartResolver配置,其他配置不要,但是下面的param-value要指定默认的配置文件和web-main-image.xml两个文件,指定两个以都好分割就好了。<param-value>WEB-INF/config/spring/web/web-main.xml,WEB-INF/config/spring/web/web-main-image.xml</param-value>

 

 < textarea id="content" name = "content" value="$!{obj.content}" ></textarea>
   

 指定相应的方法约束用MultipartHttpServletRequest (只有配置这个的方法才用springmvc的上传)

 

<servlet-mapping>
    <servlet-name>springServletImage</servlet-name>  
    <url-pattern>/projectpart/mangage/xxx.htm</url-pattern>  
</servlet-mapping> 
 

   OK 配置完成,spring 对象绑定成功。上传的方法都添加一个sevlet-mapping 只是url-pattern 不同而已。

在页面层凡是上传的都必须加上enctype="multipart/form-data",否则request不是DefaultMultipartHttpServletRequest,就无法获取DTO,所以必须加上enctype属性。不能直接输入请求地址,直接输入的话还是默认的request 

4 KindEditor 使用默认的HttpServletRequest,这个也可以用MultipartHttpServletRequest,为了灵活,使用默认的HttpServletRequest 

页面调用

 

<textarea id="content" name = "content"    value="$!{obj.content}" ></textarea>

引用JS:

 

 

<script src="$!{basepath}/common/kindeditor/kindeditor-min.js"></script>
 

 

 
<script src="$!{basepath}/common/kindeditor/lang/zh_CN.js"></script>
  

编辑器调用:这个在jquery中$()里面调用,uploadJson指定相应的action的方法 

 

	KindEditor.ready(function(K) {
		var editor1 = K.create('textarea[id="content"]', {
			cssPath : appServer+'/common/kindeditor/plugins/code/prettify.css',
			uploadJson : appServer+'/xxxupload.htm',
			allowFileManager : true,
			afterCreate : function() {
				var self = this;
				K.ctrl(document, 13, function() {
					self.sync();
					document.forms['example'].submit();
				});
				K.ctrl(self.edit.doc, 13, function() {
					self.sync();
					document.forms['example'].submit();
				});
			}
		});
		prettyPrint();
	});

 Action处理: 上传方法使用编辑器默认的代码处理:

   @RequestMapping(value = "/xxxupload.htm")

	public void xxxUpload(HttpServletRequest request,
			HttpServletResponse response, ModelMap model) {
		PrintWriter out = null;
		try {
			out = response.getWriter();
			// 文件保存目录路径
			String savePath = request.getRealPath("//")
					+ "//attached//xxxuploadFolder//";
			// 文件保存目录URL
			String saveUrl = request.getScheme() + "://"
					+ request.getServerName() + ":" + request.getServerPort()
					+ request.getContextPath() + "/attached/teambuy/";

			// 定义允许上传的文件扩展名
			HashMap<String, String> extMap = new HashMap<String, String>();
			extMap.put("image", "gif,jpg,jpeg,png,bmp");
			extMap.put("flash", "swf,flv");
			extMap.put("media",
					"swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
			extMap.put("file",
					"doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");

			// 最大文件大小
			long maxSize = 1000000;
			response.setContentType("text/html; charset=UTF-8");
			if (!ServletFileUpload.isMultipartContent(request)) {
				out.println(getError("请选择文件。"));
				return;
			}
			// 检查目录
			File uploadDir = new File(savePath);
			if (!uploadDir.isDirectory()) {
				out.println(getError("上传目录不存在。"));
				return;
			}
			// 检查目录写权限
			if (!uploadDir.canWrite()) {
				out.println(getError("上传目录没有写权限。"));
				return;
			}
			String dirName = request.getParameter("dir");
			if (dirName == null) {
				dirName = "image";
			}
			if (!extMap.containsKey(dirName)) {
				out.println(getError("目录名不正确。"));
				return;
			}
			// 创建文件夹
			savePath += dirName + "/";
			saveUrl += dirName + "/";
			File saveDirFile = new File(savePath);
			if (!saveDirFile.exists()) {
				saveDirFile.mkdirs();
			}
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
			String ymd = sdf.format(new Date());
			savePath += ymd + "/";
			saveUrl += ymd + "/";
			File dirFile = new File(savePath);
			if (!dirFile.exists()) {
				dirFile.mkdirs();
			}

			FileItemFactory factory = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setHeaderEncoding("UTF-8");
			List items = upload.parseRequest(request);
			Iterator itr = items.iterator();
			while (itr.hasNext()) {
				FileItem item = (FileItem) itr.next();
				String fileName = item.getName();
				long fileSize = item.getSize();
				if (!item.isFormField()) {
					// 检查文件大小
					if (item.getSize() > maxSize) {
						out.println(getError("上传文件大小超过限制。"));
						return;
					}
					// 检查扩展名
					String fileExt = fileName.substring(
							fileName.lastIndexOf(".") + 1).toLowerCase();
					if (!Arrays.<String> asList(extMap.get(dirName).split(","))
							.contains(fileExt)) {
						out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许"
								+ extMap.get(dirName) + "格式。"));
						return;
					}

					SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
					String newFileName = df.format(new Date()) + "_"
							+ new Random().nextInt(1000) + "." + fileExt;
					try {
						File uploadedFile = new File(savePath, newFileName);
						System.out.print(newFileName);
						item.write(uploadedFile);
					} catch (Exception e) {
						out.println(getError("上传文件失败。"));
						return;
					}

					JSONObject obj = new JSONObject();
					obj.put("error", 0);
					obj.put("url", saveUrl + newFileName);
					out.println(obj.toJSONString());
					
				}
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}
 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
2 楼 步青龙 2012-08-23  
anyflowers 写道
我使用kindeditor默认的上传方式处理,怎么这里获取不到值:
FileItemFactory factory = new DiskFileItemFactory();  
ServletFileUpload upload = new ServletFileUpload(factory);  
upload.setHeaderEncoding("UTF-8");  
List items = upload.parseRequest(request);

items为空,spring mvc不是用注解的


1 自己写上传的话 保证有enctype="multipart/form-data" 否则无法获取文件
2 看看你的 springServlet 有没相关配置,有的话去掉,单独弄一个配置文件只写上传相关的配置,web.xml配置一下请求的parame-value 指定两个配置文件 以逗号分隔就好了。
文章里都的有啊
1 楼 anyflowers 2012-08-23  
我使用kindeditor默认的上传方式处理,怎么这里获取不到值:
FileItemFactory factory = new DiskFileItemFactory();  
ServletFileUpload upload = new ServletFileUpload(factory);  
upload.setHeaderEncoding("UTF-8");  
List items = upload.parseRequest(request);

items为空,spring mvc不是用注解的

相关推荐

    Linux 那些破事儿之我的高性能

    ### Linux那些破事儿之我的高性能:epoll详解 #### 引言 在深入探讨Linux系统中的高并发与高性能特质之前,让我们简要回顾一下作者在文章开篇引用台湾作家林清玄的一段话,以此来引入对Linux系统性能优化主题的...

    Linux那些破事儿之我的高性能

    ### Linux高性能探索:Epoll详解 #### 一、引言 在探讨Linux系统中的高性能特性时,台湾作家林清玄的写作生涯比喻提供了一个有趣的视角。他将其写作历程分为三个阶段:才华横溢的初试啼声、逐渐成熟并学会与周遭...

    多线程的那点破事儿-------

    在“多线程的那点破事儿”这一主题中,我们将深入探讨多线程的核心概念、应用场景以及可能遇到的问题。 首先,我们需要理解什么是线程。线程是操作系统分配处理器时间的基本单元,一个进程可以包含一个或多个线程。...

    SSM整合+火车票查询系统.docx

    Spring框架提供了 IoC容器和AOP功能,SpringMVC框架提供了基于MVC模式的Web开发功能,MyBatis框架提供了数据库持久层功能。 2. Maven依赖管理 Maven是JavaEE开发中最流行的依赖管理工具,提供了便捷的依赖管理和...

    JSP 与 Servlet 不得不 说的那点破事儿

    ­ 简单的图解: 转化 响应客户端 Jsp页面 ----- Tomcat中-----> Servlet -------->

    ssm整合小项目源码

    它采用模型-视图-控制器(Model-View-Controller,MVC)架构模式,将业务逻辑、数据和用户界面分离,提高了代码的可复用性和可维护性。SpringMVC通过DispatcherServlet作为前端控制器,接收请求并分发到相应的处理器...

    SpringMVC基础篇笔记.docx基础篇笔记.docx

    - 在Spring 3.0之后,SpringMVC全面超越Struts2,成为最优秀的MVC框架之一。 #### 二、编写第一个HelloWorld 本节主要介绍如何快速搭建一个SpringMVC项目,并完成一个简单的“Hello World”示例。 - **步骤**: ...

    通过Socket搭建Web服务器

    Socket基础运用,搭建web服务,通过Socket搭建Web服务器

    mybatis开发笔记.docx

    ### MyBatis 开发知识点详解 #### 一、构建Maven工程 MyBatis作为一款优秀的持久层框架,在Java项目中的应用非常广泛。为了更好地利用MyBatis进行开发,我们通常会选择基于Maven来构建项目。 ...

    软件设计师,视屏集合,真题和真题分析

    软件设计师,视屏集合,真题和真题分析软件设计师,视屏集合,真题和真题分析

    通过fastJSON封装JSON

    json知识运用,fastjson进行封装,通过fastJSON封装JSON

    Oracle数据库基础及应用实训代码与截图

    Oracle 数据库基础及应用实训代码与截图 Oracle 数据库基础及应用实训代码与截图是 Oracle 数据库的基础知识和实践操作的集合,涵盖了 Oracle 数据库的基本操作、数据约束、数据操作、模块化编程、触发器和数据库的...

    软件设计师,视屏教学,真题word集合

    软件设计师,视屏教学,真题word集合,软件设计师,视屏教学,真题word集合

    jquery表单验证实例

    jquery的基础知识运用, jquery表单验证实例,深入了解

    收款机管理系统建模

    统一建模UML实现收款机管理系统建模,UML基础知识的练习小项目

Global site tag (gtag.js) - Google Analytics