1

这个问题似乎只出现在我试图发布的“大”文件中。

我的代码如下所示:

PostMethod method = new PostMethod(url);

File input = new File(filePathname);
RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");

method.setRequestEntity(entity);
method.setRequestHeader("Content-Disposition", "attachment; filename=xyzzy")

HttpClient client = new HttpClient();
Credentials defaultcreds = new UsernamePasswordCredentials("userid", "pw");

client.getState().setCredentials(new AuthScope("hostname", port, AuthScope.ANY_REALM), defaultcreds);

 try {
    int statusCode = client.executeMethod(method);

    if (statusCode != HttpStatus.SC_OK) {
        throw new Exception("Method failed: " + method.getStatusLine());
    }

    // Read the response body.
    byte[] responseBody = method.getResponseBody();
    return new String(responseBody);
 }
 catch (HttpException e) {
    System.err.println("Fatal protocol violation: " + e.getMessage());
    throw e;

 }
 catch (IOException e) {
    System.err.println("Fatal transport error: " + e.getMessage());
    throw e;

 }
 finally {
     // Release the connection.
     method.releaseConnection();
 }

异常文本如下所示:

致命传输错误:分块流意外结束
线程“主”java.io.IOException 中的异常:分块流意外结束
    在 org.apache.commons.httpclient.ChunkedInputStream.getChunkSizeFromInputStream(ChunkedInputStream.java:252)
    在 org.apache.commons.httpclient.ChunkedInputStream.nextChunk(ChunkedInputStream.java:221)
    在 org.apache.commons.httpclient.ChunkedInputStream.read(ChunkedInputStream.java:176)
    在 java.io.FilterInputStream.read(FilterInputStream.java:127)
    在 org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:108)
    在 java.io.FilterInputStream.read(FilterInputStream.java:101)
    在 org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:127)
    在 org.apache.commons.httpclient.HttpMethodBase.getResponseBody(HttpMethodBase.java:690)

无论我使用 getResponseBody() 还是 getResponseBodyAsStream(),都会遇到类似的异常。

我不应该得到太多数据,但我发布了超过 200mb 的数据。

4

2 回答 2

1

我可以通过更改 PostMethod 的 requestHeader 中指定的文件名值的长度来解决这个问题。我一直在请求标头中包含完整文件路径名的编码版本。通过反复试验,我发现我“发布”的文件的成功或失败似乎取决于它所在的文件夹。一个长文件夹文件路径名不起作用,而一个短文件夹文件路径名不起作用,尽管使用相同的文件。所以我从请求头中删除了路径名,只开始包含文件名,我不再看到问题。

于 2013-02-26T16:59:00.767 回答
0

可能是旧的,可​​以节省一些时间.....我得到了这个错误,其中服务器是 Python 和 Clinet 是 Java。

第一个 -

来自 Java 客户端的错误“通过 http java.io.IOException 发送数据时出错:块末尾应有 CRLF:79/82 java.io.IOException:块末尾应有 CRLF:79/82”

第二 -

来自 Java Clinet 的错误“通过 http java.io.IOException 发送数据时出错:分块流意外结束 java.io.IOException:分块流意外结束”

通过使用分块流大小更改 ok 响应来解决这两个错误

一个有问题的——

HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nTransfer-Encoding: chunked\r\nServer: Jetty(6.1.26)\r\n\r\nDE\r\n

解决了 -

HTTP/1.1 200 OK\r\nContent-Length: 20000\r\nContent-Type: application/json\r\nTransfer-Encoding: chunked\r\nServer: Jetty(6.1.26)\r\n\r\n229\r\n

注意 = nDE 替换为 n229

于 2019-12-02T09:14:29.363 回答