关于post方式上传文件附件的错误

我改造了spring security, 使其可以进行数据级别的验证,这样以来需要从http request中读取参数值。今天在测试一个上传文件的页面时发现了个奇怪的问题。

        我在我spring security的voter中来获得页面提交的参数,因为是enctype="multipart/form-data"来提交表单的,所以用以下code来解析参数。

       

           Map<String, String[]> map = new HashMap<String, String[]>();
	   ServletFileUpload fileUpload = new ServletFileUpload();
 	   FileItemIterator items = fileUpload.getItemIterator(request);
	   while (items.hasNext()) {
		    FileItemStream item = items.next();
		    if (item.isFormField()) {
		    	String value =inputStream2String(item.openStream());
		        map.put(item.getFieldName(), new String[]{value});
    	             }
   	    }

    顺利的把参数得到了,security就走完了,进入struts业务方法,奇怪的事情发生了,form中值都不见了,当然提交的file也不见了。于是google了下,说是request中的流文件只能被解析一次,e文网也没找到好的解决方法,这里无论我用parseRequest方式还是像我上面code类型,都有这个问题,当然也包括了用srping 的web方式解析,总之不行,理由应该是:stream被消费过就没了。

       解决方式是偶然发现的,把需要在页面提交的其他非文件的参数放在form表单的action地址后面,像这样:action=" /learn/save.do?id=23".  

        问题解决了,我对底层的实现其实还是理解不到位,只是会用,因此会有这样的问题。另外层次分的不清晰,如果使用spring security做数据级权限验证,就可能会碰到这个问题,最好的方式应该是有一层专业解析数据的level,然后无论security还是业务都基于这一层的数据来进行。这个是属于意外情况把,花了我不少时间,打乱了原来的计划

猜你喜欢

转载自sinoalex.iteye.com/blog/1887534
今日推荐