Apache Commons 文件上传 - 流意外结束

2023-12-05

好吧,我不得不说,到目前为止,这个问题让我难住了。我们在 Tomcat 6.0.18 中运行的 Web 应用程序在文件上传期间失败,但是仅当客户端机器是Windows机器时,仅适用于某些机器,并且适用于所有浏览器,而不仅仅是IE.

日志中有堆栈跟踪,这似乎表明客户端关闭了连接,或者流以某种方式损坏。堆栈跟踪中的根本原因如下:

Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983)
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
    at java.io.InputStream.read(InputStream.java:85)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
    ... 70 more

导致跟踪的代码看起来相当简单。

private Map<String, Object> getMap( ActionRequest request ) {

    HashMap<String, Object> parameters = new HashMap<String, Object>();
    if ( request == null ) {
        return parameters;
    }

    if ( request.getContentType() == null ) {
        return parameters;
    }

    try {
        if(PortletFileUpload.isMultipartContent(request)){
            DiskFileItemFactory factory = new DiskFileItemFactory();
            PortletFileUpload upload = new PortletFileUpload(factory);
            List<DiskFileItem> fileItems = upload.parseRequest(request);
            for( DiskFileItem fileItem : fileItems ) {
                String name = fileItem.getFieldName();
                //now set appropriate variable, populate hashtable
                if( fileItem.isFormField() ) {
                    String value = fileItem.getString( request.getCharacterEncoding() );
                    if( parameters.get( name ) == null ) {
                        String[] values = new String[1];
                        values[0] = value;
                        parameters.put( name, values );
                    } else {
                        Object prevobj = parameters.get( name );
                        if( prevobj instanceof String[] ) {
                            String[] prev = ( String[] ) prevobj;
                            String[] newStr = new String[prev.length + 1];
                            System.arraycopy(
                                    prev, 0, newStr, 0,
                                    prev.length
                            );
                            newStr[prev.length] = value;
                            parameters.put( name, newStr );
                        } else {
                            //now what? I think this breaks the standard.
                            throw new EatMyHatException(
                                    "file and input field with same name?"
                            );
                        }
                    }
                } else {
                    // Yes, we don't return FileParameter[] for multiple files of same name.  AFAIK, that's not allowed.
                    FileParameter fp = new FileParameter( fileItem );
                    parameters.put( name, fp );
                    files.add( fp );
                }
            }
        } else {
            // Not multipart
            return toObjectMap(request.getParameterMap());
        }
    } catch (FileUploadException e) {
        throw new RuntimeException(e);
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e);
    }
    return parameters;
}

给我们带来悲伤的是这一行:

List<DiskFileItem> fileItems = upload.parseRequest(request);

由于某种原因,确定来自某些 Windows 计算机的流在某种程度上已损坏。

我想我找到了一些东西可能相关在 StackOverflow 上。这似乎表明 Tomcat 6 中存在一些错误,该错误已在版本 6.0.20 中修复,该版本比我们正在使用的版本稍高。不幸的是,它没有提到问题本身是什么。我有看过了在 Tomcat 变更日志中,但看不到任何可能导致此问题的错误。

无论如何,关于我的实际问题,有没有人遇到过类似的问题,如果是的话,根本问题是什么以及您是如何解决的?

预先感谢您的任何回复。

编辑:这似乎是负载平衡和 Tomcat 的某种问题。如果绕过负载均衡器并直接通过服务器IP地址访问Tomcat,问题就会消失。奇怪的是,这出现在我们使用 Apache/AJP1.3 的临时环境和使用 Zeus 的实时环境中。

EDIT3:事实证明这是客户端防火墙的问题。看来他们……呃……当他们说他们肯定知道这不是防火墙问题时,他们并不完全诚实。


也许您需要 tcpdump/wireshark 错误和正确的上传,然后比较它们?

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

Apache Commons 文件上传 - 流意外结束 的相关文章

  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • 如何使用 afnetworking 在后台上传任务

    我正在尝试使用 AFNetworking 上传大文件 并在应用程序处于后台时继续上传 我可以很好地上传文件 但是当我尝试使用后台配置时 应用程序崩溃并显示以下堆栈跟踪 异常 EXC BAD ACCESS 代码 1 地址 0x8000001f
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public

随机推荐

  • 对 Python Dataframe 中的行求和

    我刚刚开始学习 Python 所以如果这个问题已经在其他地方得到了回答 请原谅我 我想创建一个名为 Sum 的新列 它只是将前面的列相加 Risk Parity tail VCIT VCLT PCY RWR IJR XLU EWL Date
  • 如何在 MATLAB 中中止程序执行?

    如何在不退出 MATLAB 的情况下停止 MATLAB 中的程序执行 我正在寻找类似 C 中的 exit 1 的东西 我尝试过退出 退出 但它们也会杀死 MATLAB 这不是我想要的行为 理想情况下 我会使用 try catch 来冒泡错误
  • 我的碰撞检测无法正常工作

    我正在使用 pygame 和 math 模块在 python 中编写游戏 我编写了这些代码来进行碰撞检测 我制作了 5 个障碍物 我希望我的玩家与它们发生碰撞 但问题是在玩游戏的过程中 有时有效 有时无效 这些是我定义的碰撞函数 def c
  • NSDecimalNumber 对长数字进行舍入

    我试图让 NSDecimalNumber 打印出大数字 15 位或更多数字 在 15 位数字中 我看到 111 111 111 111 111 超过 15 位数字时 我看到的是 1 111 111 111 111 110 即使格式化的数字是
  • Angular 2 RC1:从使用的初始 URL 获取参数

    有些用户通过邀请进入我的网络应用程序 所以他们会有一个看起来像这样的链接 https example com invitaion 12345其中 12345 是他们的唯一邀请号码 当用户单击链接时 框架在客户端初始化我的 AppCompon
  • Spring Security oauth2“未找到授权请求”

    我将 Spring Security 5 2 1 配置为与 Google 一起使用 Oauth2 该应用程序在本地运行良好 当部署在 Azure 应用服务上时 每当我尝试 Oauth2 登录流程时 都会出现以下异常 我被转发到 login
  • 包含相同元素的两个数组可以不相等吗?

    今天我遇到了一个令人震惊的问题 我试图查找一个对象是否包含在 List 集合中 问题是 当我已经可以看到该对象时 列表找不到该对象并返回索引为 1 然后我创建了一个自定义索引查找器通过比较属性而不是直接相等来查找对象 我发现对象的属性之一
  • 在 FORTRAN 中创建名称包含实数的目录

    在我的程序中 我需要存储不同情况的结果文件 我决定创建单独的目录来存储这些结果文件 这里用伪代码来解释具体的情况 do i 1 N N cases of my analysis U SPEED i call write files U Cr
  • Siri 支持无效 - 警告 iTunes Connect

    我将 SiriKit 集成到我的应用程序中以骑书 但将我的应用程序发送到 TestFlight 后 我 收到一封邮件回复 其中包含下一个警告 Siri 支持无效 未提供示例短语 en CO 语言中的 INGGetRideStatusInte
  • Ivy 似乎只获取 javadoc jar

    我在我的项目中使用 Ivy 以及 Ivy Eclipse 插件 看起来下载并添加到我的项目中的某些 jar 是 javadoc jar 而不是带有实际代码的 jar 注意 并非所有罐子都会发生这种情况 例如 将其添加到我的 ivy xml
  • 如何使用jquery删除所有cookie[重复]

    这个问题在这里已经有答案了 可能的重复 使用javascript清除所有cookie 我希望分配一个复选框来一次性激活和清除以前存储在我的表单中的所有 cookie 我该如何使用 jquery cookie 插件来做到这一点 我似乎无法在克
  • 常量构造函数

    在C 中是否可以实现类似于构造函数之类的只允许创建的东西const物体 我正在考虑为接口创建一个装饰器类const和非const方法 从 a 初始化装饰器const基对象应该只能生成 const 装饰器 但从非 const 初始化应该会产生
  • 为什么这段代码会崩溃?

    以下代码会导致堆栈溢出 但我不明白为什么 int tmain int argc TCHAR argv cout lt lt start char bmp 1024 768 3 for int p 0 p lt 9000 p for int
  • 读取网页内容

    你好 我想使用java读取包含德语字符的网页内容 不幸的是 德语字符显示为奇怪的字符 请提供任何帮助 这是我的代码 String link some german link URL url new URL link BufferedRead
  • 如何设置Spark Kmeans初始中心

    我正在使用 Spark ML 来运行 Kmeans 我有一堆数据和三个现有中心 例如这三个中心是 1 0 1 0 1 0 5 0 5 0 5 0 9 0 9 0 9 0 那么我如何表明 Kmeans 中心是上述三个向量 我看到 Kmean
  • Ionic-Framework (4) - Openlayers 地图不工作/不可见

    我尝试将 Openlayers 与 Ionic 一起使用 但地图在 setTimeout 之前不可见 这是我的工作代码 import Component OnInit from angular core import OlMap from
  • 找不到类型或命名空间

    我目前正在尝试将 Visual Studio 2008 中的 WiX 3 5 自定义操作项目转换为 WiX 3 7 和 Visual Studio 2012 但出现以下异常 找不到类型或名称空间名称 MyNamespace 您是 缺少 us
  • 页面加载时,如何让六个函数互相执行?

    当页面加载时 在一个大div中 有六个不同的元素 这些元素有六个不同的函数 我想让这些函数在一定时间后互相执行 例如1000ms 但这六个函数不是绑定到一个元素 它们绑定到六个不同的元素 例如 当页面加载时 我想将Class line1 添
  • 如何使 在 div 内垂直居中? [复制]

    这个问题在这里已经有答案了 代码 div style border solid 1px gray width 400px padding 0px span style background e2e6f0 padding right 4px
  • Apache Commons 文件上传 - 流意外结束

    好吧 我不得不说 到目前为止 这个问题让我难住了 我们在 Tomcat 6 0 18 中运行的 Web 应用程序在文件上传期间失败 但是仅当客户端机器是Windows机器时 仅适用于某些机器 并且适用于所有浏览器 而不仅仅是IE 日志中有堆