`

关于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还是业务都基于这一层的数据来进行。这个是属于意外情况把,花了我不少时间,打乱了原来的计划

 

分享到:
评论

相关推荐

    c# .net后台post上传文件

    以上就是关于"C# .NET后台post上传文件"这一主题的主要知识点,包括HTTP POST请求、ASP.NET MVC框架的应用、文件上传的前端和后端处理、图片处理、存储策略以及安全性和异常处理等方面。在实际开发中,这些知识点将...

    C++使用libcurl提供的API上传文件且Post表单数据

    在这个场景中,我们将深入探讨如何利用libcurl在C++中上传文件并发送POST表单数据。 首先,`con_test.cpp`是主要的源代码文件,它包含了使用libcurl进行文件上传和POST操作的具体实现。`StdAfx.cpp`和`StdAfx.h`是...

    上传附件到指定服务器API接口

    - 权限验证:对API调用进行身份验证和授权,确保只有合法用户可以上传文件。 - 文件大小限制:限制单个文件的大小以防止DoS攻击。 - 类型检查:验证上传文件类型,防止恶意文件如病毒或脚本的上传。 - 数据加密...

    java 附件文件上传

    需要对上传文件进行安全检查,防止上传恶意文件或超过服务器存储限制的文件。可以检查文件类型、大小,并对文件名进行清理,防止路径遍历攻击。 10. **性能优化** 大文件上传可能导致内存溢出,可以考虑使用流式...

    关于修改Roundcube Webmail上传附件的大小

    这两行代码的作用是分别设置上传文件的最大尺寸为30MB,以及POST请求的最大尺寸也为30MB。这里需要注意的是,这些值可以根据实际需要进行调整,但通常建议保持`upload_max_filesize`和`post_max_size`的值相同或...

    在单片机上实现http upload 小文件上传

    3. 在任务中读取待上传文件的数据,并计算文件长度。 4. 设置HTTP请求头,包括"Content-Type"(如"application/octet-stream"表示二进制数据)和"Content-Length"。 5. 开始POST请求,将文件数据分块发送。 6. 监听...

    vue附件点击上传和拖拽上传.zip

    总的来说,"vue附件点击上传和拖拽上传.zip"这个项目提供了一个基础的Vue文件上传实现,涵盖了点击上传和拖拽上传两种方式,同时也涉及到了文件上传的处理和服务器交互。通过这个示例,开发者可以了解到如何在Vue...

    Lotus domino BS 多附件上传例子 Lotus domino jquery附件上传 domino上传附件不刷新界面

    然而,通过使用AJAX(Asynchronous JavaScript and XML)技术,可以实现在后台异步上传文件,用户界面不会刷新,提高了上传的效率和用户体验。在Lotus Domino与jQuery的集成中,一般会创建一个隐藏的表单或使用...

    仿163附件上传,选择文件后立即上传,上传完成后可以删除,.NET源码

    通过分析和理解这个.NET源码,开发者可以学习到如何集成SWFUpload库,实现高效且用户友好的文件上传功能,并处理上传后的文件管理,特别是解决已上传文件的删除问题。这个资源对于那些想要在.NET环境中提升文件上传...

    C# winform 上传文件 (多种方案)

    WebClient 是 .NET Framework 中的一个类,提供了一种简单的方式来上传文件到服务器。下面是一个使用 WebClient 上传文件的示例代码: ```csharp using System; using System.Net; public class ...

    uniapp实现移动端上传文件功能

    uniAPP,作为一个跨端开发框架,为开发者提供了便捷的方式来实现移动端的文件上传功能。下面,我们将详细探讨如何在uniAPP中实现这一功能。 首先,我们需要了解uniAPP的基础知识。uniAPP是由DCloud(北京嘀嗒出行...

    C#模仿http请求到服务器端 上传附件

    因为我们是要上传文件,所以请求方法应设置为POST或PUT。在C#中,可以通过`RequestMethod`属性来设定: ```csharp request.Method = "POST"; ``` 3. **设置请求头**: 需要设置Content-Type为multipart/form-...

    mantis上传附件大小问题

    2. **upload_max_filesize**:此参数控制着单个上传文件的最大尺寸。若文件超过设定的大小限制,则无法成功上传至服务器。 为了确保Mantis能够正常处理较大尺寸的附件,通常建议设置`post_max_size`的值大于等于`...

    C#实现HTTP上传文件的方法

    总之,C#中实现HTTP上传文件的关键在于构造正确的HTTP请求,包括POST方法、multipart/form-data Content-Type和分隔线,以及正确处理文件数据和请求响应。通过以上代码,你可以理解并实现一个基础的文件上传功能。...

    调用WebApi接口上传文件

    在实际项目中,还要注意性能优化、错误处理和安全性检查,以提供稳定可靠的文件上传功能。在提供的`MvcUploadFile`示例中,可能包含了实现这些功能的代码示例,你可以参考并根据自己的需求进行调整。

    c++实现向web服务器上传文件

    本文将深入探讨如何使用C++实现向Web服务器上传文件,特别是在VS2013环境下,以及与Java Web工程的交互。 首先,我们要了解HTTP协议中的POST方法。在Web应用中,POST请求常用于提交数据到服务器进行处理,例如当...

    通用 万能 HttpHandler webRequest 文件上传

    总之,"通用 万能 HttpHandler webRequest 文件上传"是一个关于使用自定义HttpHandler和HttpWebRequest进行文件上传的技术主题。这个解决方案旨在提供一个高度可定制和可扩展的文件上传服务,以满足各种Web应用的...

    文件上传的

    文件上传过程中可能出现各种错误,如网络中断、文件过大、格式不正确等。良好的错误处理机制能提供友好的反馈,提高用户体验。 8. **性能优化**: 对于大文件上传,可能需要实现断点续传、分块上传等功能,以提高...

    HttpClient PostMethod 上传文件

    在本示例中,我们将深入探讨如何使用HttpClient的PostMethod来上传文件,以及处理Get和Post请求中的乱码问题。 一、HttpClient基础 HttpClient库提供了一套完整的API,允许我们构建复杂的HTTP请求。它支持GET、POST...

    jquery实现多附件上传

    7. **蓝imp jQuery 文件上传插件**:`blueimp-jQuery-File-Upload`是jQuery的一个知名插件,提供了一套完整的文件上传解决方案,包括多文件选择、预览、进度条、错误处理等功能。在项目中使用这个插件,可以大大简化...

Global site tag (gtag.js) - Google Analytics