我在使用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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到这个异常,通常是因为在文件上传过程中数据流被意外中断,导致服务器端无法正确解析上传的多部分(multipart)请求。Swfupload 和 FileUpload 组合使用时,如果用户在上传过程中选择取消或者网络问题导致连接中断,可能会触发这个问题。
这里有几个可能的解决方案和建议:
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异常重新抛出
}
}
客户端优雅地终止上传:确保Swfupload在用户取消上传时能够向服务器发送一个明确的信号,而不是直接断开连接。虽然Swfupload本身可能不支持这种精细控制,但可以考虑使用更现代的上传库如Plupload,它提供了更完善的上传管理功能,包括中断和恢复上传的能力。
设置超时和重试机制:在服务器端配置合理的超时时间,并考虑实现简单的重试逻辑来应对暂时的网络波动。不过,对于用户主动中断的上传,重试并不适用。
优化前端提示:在前端界面提供清晰的上传状态指示和取消按钮,当用户点击取消时,先通过Ajax请求告知服务器即将取消上传,尽管这一步骤不能完全避免异常,但有助于提升用户体验。
升级相关依赖:确认你使用的Apache Commons FileUpload库是否为最新版本,有时候这些问题会在新版本中得到修复。同时检查是否有其他兼容的库可以替代,以获得更好的稳定性和功能支持。
请根据你的具体应用场景选择合适的解决策略。