在我的 POST servlet 可以处理我的 uploadFile 之前,是什么“吃掉”了它?

2023-12-11

我在网页上使用 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,您能否提出任何其他建议来简化此操作?


如果你使用 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 模式是/*,这意味着每个请求都会被 StrutsPrepareAndExecuteFilter(通常称为 Filter Dispatcher,这也是旧的过滤器名称,在 Struts 2.1.8 之前的版本中)拦截。

如果你调用一个动作,那就完美了。如果您调用 servlet、Web 服务或其他内容,这就会出现问题,因为 Struts Filter 应该仅针对操作运行。

要排除特定 url(或特定模式)被过滤器拦截,需要使用常量struts.action.excludePattern在 struts.xml 中,如中所述

  • 带有 Struts2 的泽西岛

  • 如何在Struts2中使用Servlet

  • Apache 官方文档:web.xml

然后放入struts.xml

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

它应该有效。


此时,我很好奇为什么您使用 Struts2 而不利用强大的内置文件上传功能,这在

  • 需要一次上传多个文件

并且可以与其他面向上传的框架一起使用,只需进行一些细微的调整,如:

  • 使用 Dropzone.js 在 Struts2 中上传多个文件

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

uploadDoc_0__frm_if

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在我的 POST servlet 可以处理我的 uploadFile 之前,是什么“吃掉”了它? 的相关文章

随机推荐

  • 如何将数组(Google 应用脚本)返回到 HTML 侧边栏?

    我想将我在 code gs 中创建的一些数组返回到 HTML 侧边栏并使用它来填充选择 到目前为止我有这个 假设我想使用 this part of the array for the select 作为 html 选择 code gs fu
  • 在 SwiftUI 列表中呈现 Realm 数据的正确方法是什么

    我正在尝试从中获取所有项目Realm并将它们显示在SwiftUI List但我不断收到错误 In a UIKit Realm应用程序 我只想创建一个Results变量来存储所有项目Realm然后 我会获取中的项目viewDidLoad方法并
  • 类型错误:不可排序的类型:str() < int()

    我使用的是 python 3 5 所有包都是以下版本 numpy 1 12 0b1 mkl cp35 cp35m win amd64 scikit learn 0 18 1 cp35 cp35m win amd64 scipy 0 18 1
  • 在div之上创建一个浮动div

    我正在尝试创建类似以下的内容 div 1 div2 on top of div1 div3 div2 div3 我想创建一个div2在两者之上div1 and div3 我真的不知道如何做到这一点 有人可以帮我吗 谢谢 您
  • SwiftUI @Binding 初始化

    一直在玩 SwiftUI 并理解了这个概念BindableObjects到目前为止等等 至少我希望如此 我遇到了一个愚蠢的问题 我似乎找不到答案 你如何初始化一个 Binding多变的 我有以下代码 struct LoggedInView
  • 将不同的格式应用于不同的列数据框

    我有以下 df table A B C D 0 0 000000 0 000000 0 002520 0 002520 1 0 209772 0 016262 0 003411 0 024343 2 0 006474 0 000152 0
  • c++ OpenCV 将 Mat 转换为一维数组

    我有这个Mat Mat testDataMat 386 2 CV 32FC1 testDataFloat 其中取自 float testDataFloat 386 2 但我不知道如何将它变成一维数组 有什么帮助吗 样本包括 从浮点二维数组转
  • android viewPager 实现 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我的任务是向右滚动到另一个屏幕 然后按图标并显示弹出窗口 我想用ViewPager在两个
  • 在gui线程中触发异步事件

    TL DR 我正在寻找一种方法让一个线程在另一个线程中引发事件 EDIT 我说的是 立即 这个词 正如一些评论者指出的那样 这是不可能的 我的意思是 如果 gui 线程空闲的话 它应该相当快地发生 在低毫秒到纳秒的范围内 如果我做得正确 它
  • CSS3 过渡 + 不显示 + 防止过度滚动

    因此 如果您还不熟悉 CSS3 过渡不会产生动画display none因为它从 DOM 中完全删除了目标元素 这是我的问题 我有一个侧边栏 其中悬停时会出现更大的弹出 div 不幸的是 因为我只能过渡visibility hidden a
  • 在 Express (node.js) 中动态限制上传文件大小

    我正在开发一个简单的应用程序 允许用户上传他们的内容 我想限制 Express 接受的文件大小 我知道我可以使用 app use express limit 2mb 但是我要动态改变限制 某些用户会有更高的限制 最好的解决方案是首先检查co
  • 为什么 Django 迁移在每一行上使用相同的随机默认值?

    Note 我理解并且很清楚将函数作为参数传递和调用函数并将结果作为参数传递之间的区别 我相信我正确地传递了该函数 Specs 姜戈 1 11 PostgreSQL 10 4 设想 我的应用程序中有数十个模型 并且有许多现有记录 我需要向每个
  • 检查 Inno Setup 中是否安装了 .NET 5.0

    我有以下 iss 脚本来编译我正在开发的使用 NET 5 0 的游戏启动器 目前 它每次都会尝试从安装程序安装 NET 5 0 而不是先检查是否需要 我找到了大量资源来告诉您如何针对 NET Framework 执行此操作 但几乎没有找到针
  • CollectionView 在调试中工作,但在 .NET MAUI 中的发布中不起作用

    我有以下内容
  • Swiftui 获取图像的显示尺寸

    我试图获取显示图像的尺寸 以在我使用苹果的 Vision 框架识别的文本上绘制边界框 因此 我在按下此功能的按钮后运行 VNRecognizeTextRequest func readImage image NSImage completi
  • 如何自定义(或禁用)JQuery Mobile 中的自动“后退”按钮

    是否可以自定义 或简单地禁用 JQuery Mobile 中的自动 后退 按钮 我想你正在寻找这个 http jquerymobile com demos 1 0a3 docs toolbars docs headers html 要禁用它
  • Neon:如何在jdk9上运行?

    刚开始玩 jdk9 一开始就卡住了 下载并解压 eclipse java neon m4a win32 安装了 java 9 支持 由 dnd 来自市场 下载并安装jdk9u99 仅jdk 不是公共jre 此时 我可以使用 jre jdk
  • 可以在单词发音游戏中使用WIndows语音识别引擎吗?

    我用来创建一个使用 Windows 语音识别引擎或 SAPI 的应用程序 这就像一个游戏发音当你正确发音时它会给你分数 但是当我开始使用 SAPI 进行实验时 它的识别效果很差 除非您在其上加载语法 XML 否则它会给出最佳的识别结果 但现
  • 按组查找系列中的下一个日期

    我有一些这样的数据 sample data lt rbind data table start date seq from as Date 2010 01 01 to as Date 2014 12 01 by quarter Group
  • 在我的 POST servlet 可以处理我的 uploadFile 之前,是什么“吃掉”了它?

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