关于fileupload里面的Stream ended unexpectedly

项目需要做一个客户端将崩溃日志文件发送到服务器的功能,然后同事就用到了apache的commons-fileupload-1.3.1.jar这个包,部分代码如下:

ServletFileUpload upload = new ServletFileUpload();
				upload.setHeaderEncoding("utf-8");

				// Set overall request size constraint
				upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB
				upload.setFileSizeMax(3 * 1024 * 1024l);

				FileItemIterator i = upload.getItemIterator(request);//得到所有的文件
				//Iterator<FileItem> i = items.iterator();
				FileOutputStream fout = null;
				BufferedOutputStream bout = null;
				BufferedInputStream bin = null;
				try {
					while (i.hasNext()) {
						FileItemStream item = i.next();
						String name = item.getName();
						out.println(name);
						InputStream stream = item.openStream();
						File f = new File("/" + item.getName());

						System.out.println(f.getAbsolutePath());

						fout = new FileOutputStream(f);
						bout = new BufferedOutputStream(fout);
						bin = new BufferedInputStream(stream);

						int byte_;

						while ((byte_ = bin.read()) != -1) {
							bout.write(byte_);
						}

						bout.close();
						bin.close();
					}
				} catch (Exception e) {
					e.printStackTrace();
					if (fout != null) {
						fout.close();
					}
					if (bout != null) {
						bout.close();
					}
					if (bin != null) {
						bin.close();
					}
				}

代码因为照着apache的格式写的,所以也没啥问题。但是每次测试都会报错,错误日志如下:

org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
	at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:1005)
	at org.apache.commons.fileupload.MultipartStream$ItemInputStream.close(MultipartStream.java:943)
	at org.apache.commons.fileupload.MultipartStream$ItemInputStream.close(MultipartStream.java:922)
	at java.io.FilterInputStream.close(FilterInputStream.java:181)
	at org.apache.commons.fileupload.util.LimitedInputStream.close(LimitedInputStream.java:164)
	at java.io.BufferedInputStream.close(BufferedInputStream.java:472)
	at org.apache.jsp.fileupload_jsp._jspService(fileupload_jsp.java:210)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)

	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at com.sharp.filter.AuthorityFilter.doFilter(AuthorityFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)

	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:744)


网上查了一下,答案很多。大致分为以下几类:

1、session超时断开连接,解决方案:

修改tomcat配置文件server.xml,找到类似于下面配置:

<Connector port="8086" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
将上面的参数disableUploadTimeout值改为false即可。

2、文件过大,还是修改server.xml。在connector里面添加配置 maxPostSize="0" ,0表示无限大。

<Connector port="8086" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" maxPostSize="0" />


这两种方法都尝试了,还是没找到问题所在,然后找到我,我也是最开始在stackovverflow,csdn等网站上看了各种答案并尝试还是不行。后来断点看了一下流的信息,发觉后面很大一部分数据都是空的,那么就怀疑是不是被整个框架中间拦截导致的,于是查看了一下web.xml,发现中间有个filter,而filter因为之前项目功能需求对所有请求进行了拦截和修改,于是将这个filter的代码注释之后终于成功了。


总结下来就是 查看在fileupload进行解析request之前,看看request是不是已经进行了修改。











  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fileupload.aspx 是一个ASP.NET的页面,用于实现文件上传功能。该页面允许用户向服务器上传文件,并由服务器进行处理和保存。该页面一般包含以下功能或特点: 1. 文件选择:在Fileupload.aspx页面中,用户可以点击“选择文件”按钮,弹出文件选择对话框,从本地选择要上传的文件。用户可以选择单个文件或多个文件进行上传。 2. 文件类型过滤:在选择文件时,可以设置文件类型过滤,只允许上传指定类型的文件。例如,只允许上传图片文件(.jpg、.png等)或文档文件(.doc、.pdf等)。 3. 文件大小限制:可以在Fileupload.aspx页面中设置文件大小的限制,超过设定的大小限制将无法上传。这个限制可以根据实际需求进行设置,以避免上传过大的文件对服务器造成负担。 4. 文件上传进度条:在文件上传过程中,页面可以显示一个上传进度条,以提供用户上传进度的可视化展示。 5. 文件保存:一旦用户选择完文件并点击了上传按钮,Fileupload.aspx 页面会将选中的文件发送给服务器。服务器端代码会接收到文件并进行保存。文件可以保存在服务器的特定目录下,也可以保存在数据库中,具体保存方式可以根据需求进行选择。 总的来说,Fileupload.aspx 是一个用于文件上传的ASP.NET页面,可以方便地实现文件上传功能,并提供了一些常见的文件类型过滤、大小限制和上传进度条等功能,可以根据实际需求进行定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值