我在网页上使用 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 文档的代码片段):
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);
“项目”列表始终为空。然而,在 Eclipse 调试中,我可以看到埋藏在 Request 对象深处的 DiskFileItem 指向用户文件,该文件存储在临时目录中。从这篇文章使用ServletFileUpload的parseRequest进行文件上传?看起来 struts2 在我的 servlet 有机会之前就获取了该文件。于是我查看了struts2 FileUploadInterceptor,并没有发现太多。我用自己的拦截器覆盖它,但它永远不会被调用。我获得了 FileUpload 源,因此我可以设置断点,并且在此 fileUpload 过程中永远不会调用它。我看到执行的第一个代码是我的 servlet,此时文件已经被处理。
那么,实际上是什么在占用/上传/存储我的文件,我该如何停止它,或者使用它,以便我可以实际使用已上传的文件?
感谢您的任何见解。
==================================编辑================= =================
我为我的 servlet 添加了 @Andrea Ligios 答案中的 struts.xml 常量,但这不起作用。然后我检查了 web.xml 文件,它确实有那些过滤器行,除了它是
org.apache.struts2.dispatcher.FilterDispatcher
但是我注意到我的 struts 版本是 2.3.4,它应该具有您在答案中列出的较新名称。我将过滤器名称更改为您指定的新名称,现在它可以工作了!
然而,看来我必须手工做很多工作。我不使用内置的原因是因为我正在使用此处描述的 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,您能否提出任何其他建议来简化此操作?