什么是'吃''我的POST文件之前的uploadFile可以处理吗?

时间:2015-02-03 18:16:00

标签: servlets file-upload struts2 infragistics

我在我的网页上使用Infragistics IgniteUI igUpload将文件上传到我们的Apache Tomcat服务器,当文件上传时,我无法在我的servlet代码中访问它们。也许这里有人知道发生了什么。

当igUpload通过Ajax发送文件时,我看到一个带有Headers的很好的POST请求:

Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Length  24804
Content-Type    multipart/form-data;  boundary=---------------------------91823184012919
Cookie  JSESSIONID=BB4D29EEA9C703CA529EA48E74413A72
Host    localhost:8080
Referer http://localhost:8080/MyApp.html
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0

和帖子部分中的用户文件使用此标题' :

-----------------------------91823184012919 Content-Disposition: form-data;
 name="uploadDoc_0__frm_if"; filename="UsersFile.xls" Content-Type: application/vnd.ms-excel

然后调用我的servlet,但是当我使用它时(来自FileUpload doc的代码片段):

                DiskFileItemFactory factory = new DiskFileItemFactory();
                // Configure a repository (to ensure a secure temp location is used)
                ServletContext servletContext = this.getServletConfig().getServletContext();
                File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");                   
                factory.setRepository(repository);                                       
                // Create a new file upload handler                   
                ServletFileUpload upload = new ServletFileUpload(factory);                                       
                // Parse the request                   
                List<FileItem> items = upload.parseRequest(request);

&#34; items&#34;列表总是空的。但是,在Eclipse调试中,我可以深入查看Request对象中的DiskFileItem,该DiskFileItem指向存储在临时目录中的users文件。从这篇文章File upload with ServletFileUpload's parseRequest?来看,似乎struts2在我的servlet有机会之前获取文件。所以我查看了struts2 FileUploadInterceptor,并没有找到太多。我用自己的拦截器覆盖它并且永远不会被调用。我得到了FileUpload源,因此我可以设置断点,并且在此fileUpload过程中永远不会调用它。我看到执行的第一个代码是我的servlet,到那时该文件已被处理。

那么实际上是在吃什么/上传/存储我的文件,如何停止或使用它以便我可以实际使用上传的文件?

感谢您的任何见解。

================================编辑============== ====================

我在下面的@Andrea Ligios回答中为我的servlet添加了struts.xml常量,但是没有用。然后我检查了web.xml文件,并且DID有那些过滤行,除了它是

org.apache.struts2.dispatcher.FilterDispatcher

但是我注意到我的struts版本是2.3.4,它应该有你在答案中列出的NEWER名称。我将过滤器名称更改为您指定的新名称,现在它可以正常工作!

然而,似乎我必须手工做很多工作。我之所以不使用内置功能,是因为我使用了此处所述的Infragistics jQuery igUpload控件http://www.igniteui.com/file-upload/overviewhttp://help.infragistics.com/Doc/jQuery/2014.2/CLR4.0?page=igUpload_igUpload.html。使用此控件时,它会发送POST消息,如我在问题中所述。我想它是与ASP.NET MVC Helper一起工作的,我甚至不知道那是什么。 Infragistics IgniteUI从未在文档中提到过struts。鉴于我正在使用igUpload,您是否可以提出任何其他建议以使其更容易?

1 个答案:

答案 0 :(得分:1)

如果您使用的是Struts2,则可能会在web.xml中使用此设置:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

由于url-pattern是/*,这意味着每个请求都被StrutsPrepareAndExecuteFilter拦截(通常称为Filter Dispatcher,它也是旧的过滤器名称,在2.1.8之前的Struts版本中)。

如果你召集一个动作,这是完美的。如果你调用servlet,web服务或其他东西,这是有问题的,因为Struts Filter应该仅针对操作运行。

要排除某个特定网址(或特定模式)被过滤器拦截,您需要在struts.xml中使用常量struts.action.excludePattern,如

中所述

然后输入struts.xml

<constant name="struts.action.excludePattern" value="/YourServlet"/>

它应该有效。


此时,我很想知道为什么你在没有利用内置的文件上传功能的情况下使用Struts2,这在

中有所解释

这可以与其他面向上传的框架一起进行微调,如下所示:

我不知道您正在使用的插件,但在您的情况下,我看到的第一个(也可能是唯一的)问题是发出的参数的名称:

uploadDoc_0__frm_if

应该是无编号的,并且在变量名中仍然需要混合的CamelCase / Snake_case方法。