0

我正在尝试使用 Apache Commons 的 HttpClient 发送带有二进制文件和几个字符串参数的多部分 POST 请求。

但是,似乎在某个地方,一些垃圾文本正在进入我的字符串参数。例如,正如调试器所确认的,sizeBody这里的变量确实持有值“100”:

StringBody sizeBody = new StringBody("100", Charset.forName("UTF-8"));

但是,如果我使用 Wireshark 收听请求,我会看到:

--o2mm51iGsng9w0Pb-Guvf8XDwXgG7BPcupLnaa
Content-Disposition: form-data; name="x"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

100
a5

--o2mm51iGsng9w0Pb-Guvf8XDwXgG7BPcupLnaa

注意. a5_100

这可能是什么原因造成的?我应该去哪里看?

4

2 回答 2

1

您所看到的可能是所谓的块传输编码 [1] 使用的块标头。查看消息头是否有Transfer-Encoding: chunked字段。

[1] http://en.wikipedia.org/wiki/Chunked_transfer_encoding

于 2011-05-12T12:12:51.267 回答
0

我在使用NanoHTTPD接收它们时测试我的 POST 时遇到了同样的问题。确实,HttpClient 正在使用 NanoHTTPD 不支持的分块传输编码。在我的情况下这样做是因为二进制文件是通过提供的InputStreamBody,并且由于它无法确定其自己的内容长度(它只是发回 -1),因此客户端使用分块编码。

我切换到使用 aByteArrayBody作为文件内容,因为它StringBody可以提供内容长度,所以请求现在不使用分块编码。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy (fileInputStream, baos);  // from Apache Commons IO, or roll your own
ContentBody filePart = new ByteArrayBody (baos.toByteArray(), fileName);

当然,如果您的文件很大,将整个文件加载到上面的字节数组中可能会导致内存问题。

于 2012-05-10T15:04:22.073 回答