我在我的网页上使用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/overview和http://help.infragistics.com/Doc/jQuery/2014.2/CLR4.0?page=igUpload_igUpload.html。使用此控件时,它会发送POST消息,如我在问题中所述。我想它是与ASP.NET MVC Helper一起工作的,我甚至不知道那是什么。 Infragistics IgniteUI从未在文档中提到过struts。鉴于我正在使用igUpload,您是否可以提出任何其他建议以使其更容易?
答案 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方法。