我在上传一个音频文件> 10s时遇到了麻烦,并给了我这个错误:
WARN:oejh.HttpParser:qtp1359061041-19: badMessage: java.lang.IllegalStateException: too much data after closed for HttpChannelOverHttp@7fd0cbe{r=5,a=IDLE,uri=-}
如果我上传音频文件< 10s就可以了。
我在谷歌搜索,但我找不到任何解决方案。 对此有什么解决方案吗?
答案 0 :(得分:1)
我使用的是Cordova 3.3.0,问题出在上传上。下面的代码解决了我的问题:
var options = new FileUploadOptions();
options.fileKey="file";
options.fileName=name;
options.mimeType = "audio/amr";
options.headers = {
Connection: "close"
}
options.chunkedMode = false;
为什么码头继续给我too much data after closed
(我会尽力解释)。在进行另一次连接和请求后必须关闭连接。例如,我的上传不断重复使用相同的请求并溢出请求并给我留言。所以基本上,对于每个请求,必须关闭并打开新的请求。
为了预防,我对jetty.xml
<Set name="outputBufferSize"><Property name="jetty.output.buffer.size" default="65536" /></Set>
<Set name="requestHeaderSize"><Property name="jetty.request.header.size" default="16384" /></Set>
<Set name="responseHeaderSize"><Property name="jetty.response.header.size" default="16384" /></Set>
答案 1 :(得分:0)
这听起来像是在这里讨论的类似问题http://dev.eclipse.org/mhonarc/lists/jetty-users/msg03919.html
你是如何开始码头的?是从日志信息转到STOUT的命令行吗?如果是这样,您可能需要将应用程序作为服务启动或将日志级别配置得更低。
答案 2 :(得分:0)
要从init.d运行服务器,请将脚本$ {JETTY_HOME} /bin/jetty.sh复制到/etc/init.d/文件夹(如果要在系统引导期间启动jetty)。确保脚本具有执行权限。像
一样运行脚本 sudo /etc/init.d/jetty start
(我在/etc/init.d/文件夹中将jetty.sh复制为jetty)
答案 3 :(得分:0)
就我而言,客户端发送的表单密钥超过了允许服务器接收的数量。
所以我必须设置
WebAppContext webapp = new WebAppContext();
webapp.getServletContext().getContextHandler().setMaxFormKeys(1000000000);
在码头服务器端。
答案 4 :(得分:0)
对于Google员工,我遇到了此问题并通过将参数注释从@FormParam
更改为@FormDataParam
来解决此问题:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response post(
@FormParam("name") String name,
@FormParam("file") InputStream file) {
//...
}
为:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response post(
@FormDataParam("name") String name,
@FormDataParam("file") InputStream file) {
//...
}
我在Heroku上运行,并且偶然找到了解决方案,找到了以下文档:
其中说:
此注释与媒体类型“multipart / form-data”一起用于提交和使用包含文件,非ASCII数据和二进制数据的表单。
答案 5 :(得分:0)
对我来说问题是我没有从输入中读取。每次都没有触发错误,但是当输入超出一定大小时,就会发生这些错误。在写入输出流之前简单地完全读取输入流解决了我的问题。