使用HttpPost发送的文件已损坏和/或被截断

时间:2014-04-22 18:25:18

标签: android androidhttpclient

我使用以下代码收到文件:

byte[] fileBytes;
....
JSONObject postJSON = new JSONObject();
postJSON.put("file_name", filename);
postJSON.put("client_id", clientID);
HttpPost post = new HttpPost(fileURL);
StringEntity se = new StringEntity( postJSON.toString(), "UTF-8");  
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = httpClient.execute(post);
fileBytes = EntityUtils.toByteArray(response.getEntity());

使用调试器,我看到响应得到一个长度为27136字节的实体,这是测试文件的正确长度,但fileBytes数组只有11470字节长。任何人都可以告诉我为什么会发生这种截断吗?当我尝试获取其他文件时,会发生类似的截断,因此它不是特定文件或特定文件长度的函数。

使用以下代码,我得到同一个文件的11997个字节:

StringBuilder stringBuilder = new StringBuilder("");
stringBuilder.append(EntityUtils.toString(response.getEntity()));
fileBytes = stringBuilder.toString().getBytes();

从InputStream读取,我得到12288字节:

fileBytes = new byte[1024];
InputStream inputStream = response.getEntity().getContent();
int bytesRead = 0;
while(true){
    bytesRead = inputStream.read(fileBytes);
    if (bytesRead <= 0)
        break;
....
}

将编码更改为UTF-16会导致内部服务器错误。

我也尝试了以下内容:

InputStream inputStream = response.getEntity().getContent();
response.getEntity().getContentLength()];
while ((getByte = inputStream.read()) != -1) {
    bos.write(getByte);
}
bos.close();

这也给了我一个11470的文件。

在所有情况下,文件都已损坏,无法打开。在二进制文件查看器中进行比较时,第一个11字节匹配,然后文件发散。我在损坏的文件中找不到任何模式。

1 个答案:

答案 0 :(得分:1)

好的,答案显然是以上所有都很好。问题在于服务器没有正确配置数据流:内容类型是所有文件的text / plain,而不是application / pdf,等等。

我的第一个线索是当我们在服务器上放置一个文本文件时,它成功了。那时我开始使用服务器端,我们很快发现了它。

最重要的是,如果您正在使用服务器/客户端应用程序,问题可能不在您的身边。

我应该提到各种帖子,这些帖子帮助我构建了上面收集的各种版本:

including this

and this

我向其他各种有帮助的人道歉,他们的帖子我也看过并投票。