开发者社区 问答 正文

java 上传报错,求帮忙:报错

我在使用swfupload和fileupload共同完成文件的上传功能

因为提供了可以中断上传的功能,但是在中断的同时会抛出异常



org.apache.commons.fileupload.FileUploadBase$IOFileUploadException:  Processing of multipart/form-data request failed. Stream ended unexpectedly

at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:359)

at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)

at com.sini.utils.upload.UploadServlet.doPost(UploadServlet.java:43)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)

at java.lang.Thread.run(Unknown Source)

Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException:  Stream ended unexpectedly

at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:964)

at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)

at java.io.InputStream.read(Unknown Source)

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:354)

... 16 more

展开
收起
kun坤 2020-06-14 14:27:28 596 分享 版权
阿里云 AI 助理回答

遇到这个异常,通常是因为在文件上传过程中数据流被意外中断,导致服务器端无法正确解析上传的多部分(multipart)请求。Swfupload 和 FileUpload 组合使用时,如果用户在上传过程中选择取消或者网络问题导致连接中断,可能会触发这个问题。

这里有几个可能的解决方案和建议:

  1. 捕获并处理中断异常:在你的UploadServlet或其他处理文件上传的类中,增加对这个异常的捕获逻辑,并适当处理它。例如,你可以记录日志、通知用户上传已取消或失败,并清理任何临时文件或资源。
try {
    // 你的文件上传处理逻辑
} catch (FileUploadBase.IOFileUploadException e) {
    if (e.getCause() instanceof MultipartStream.MalformedStreamException) {
        // 处理解析异常,比如记录日志、返回错误信息给客户端等
        log.error("文件上传中断", e);
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        response.getWriter().write("文件上传被取消或发生错误");
    } else {
        throw e; // 其他类型的IO异常重新抛出
    }
}
  1. 客户端优雅地终止上传:确保Swfupload在用户取消上传时能够向服务器发送一个明确的信号,而不是直接断开连接。虽然Swfupload本身可能不支持这种精细控制,但可以考虑使用更现代的上传库如Plupload,它提供了更完善的上传管理功能,包括中断和恢复上传的能力。

  2. 设置超时和重试机制:在服务器端配置合理的超时时间,并考虑实现简单的重试逻辑来应对暂时的网络波动。不过,对于用户主动中断的上传,重试并不适用。

  3. 优化前端提示:在前端界面提供清晰的上传状态指示和取消按钮,当用户点击取消时,先通过Ajax请求告知服务器即将取消上传,尽管这一步骤不能完全避免异常,但有助于提升用户体验。

  4. 升级相关依赖:确认你使用的Apache Commons FileUpload库是否为最新版本,有时候这些问题会在新版本中得到修复。同时检查是否有其他兼容的库可以替代,以获得更好的稳定性和功能支持。

请根据你的具体应用场景选择合适的解决策略。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: