Program 是一个小程序,用于获取一些文件,处理它们,通过 ZipOutputStream 发送它们,然后将(通常相当大的)zip 文件上传到服务器。它使用 Apache HttpClient 4.2.1(和辅助库)。我的发布请求正在特权空间中执行。我遇到的问题是 Apache/2.2.16 (Win32) 拒绝接受请求。我在 Apache 错误日志中收到一个错误,“禁止分块传输编码”。
如果我使用wireshark 来捕获连接,请求如下所示:
POST /data/FileUpload.php?userId=21 HTTP/1.1
Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=PjgV56PRG1T0eeWZNfM3Gumc8v0p8j
Host: 192.168.2.16:8000
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.1 (java 1.5)
10be
--PjgV56PRG1T0eeWZNfM3Gumc8v0p8j
Content-Disposition: form-data; name="ZipFile"; filename="JavaUploaderZipStream.zip"
Content-Type: application/zip
Content-Transfer-Encoding: binary
执行这个请求的代码是:
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpclient = new DefaultHttpClient(params);
HttpPost httpPost = new HttpPost(url);
ZipCompressionInputStream zipStream = new ZipCompressionInputStream(fileList);
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.STRICT);
InputStreamBody uploadPart = new InputStreamBody(zipStream, "application/zip", "JavaUploaderZipStream.zip");
reqEntity.addPart("ZipFile", uploadPart);
httpPost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httpPost);
try {
HttpEntity responseEntity = response.getEntity();
EntityUtils.consume(responseEntity);
} finally {
httpPost.releaseConnection();
}
据我所知,Apache 2.2 应该接受分块数据。我没有看到任何拒绝它的开关。它似乎正在接受 HTTP/1.1 连接。我不知道为什么它只是拒绝我尝试的任何东西。