从我的应用程序中,我使用这个基本代码将文件上传到我们的服务器(它当然比这更多,但基本上就是这样)
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 15000);
HttpConnectionParams.setSoTimeout(params, 5 * 60 * 1000);
HttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost("upload url");
HttpEntity requestEntity = (new FileEntity(tmpFile, "multipart/form-data;boundary="+boundary);
post.setEntity(requestEntity);
HttpResponse response = (HttpResponse) client.execute(post);
大部分时间都很好。
对于某些运行Android 2.2+的手机,服务器上收到的文件 方面不完整。文件的一小部分根本就丢失了, 缺少的部分位于文件的不同位置 每一次。
我们已经通过比较应用中的文件与什么来验证这一点 在服务器端收到。在服务器端我们捕获了 使用tcpdump的数据包,以确保它不是我们的网络的问题 服务器或Web服务器代码。
我们还使用手机中的tcpdump检查了数据。手机的tcpdump文件与我们尝试发送的数据不同。对于一个案例,我们对tcpdump文件的分析是从文件中丢失地址8d68和9000之间的数据。来自tcpdump的数据包与这些地址对齐(一个数据包的一部分数据一直持续到8d68,然后下一个数据包的数据从9000开始)。
对于这些手机,问题只会在某些时候发生。有时 文件上传工作,我们最终收到整个文件。
这仅发生在2.2+手机上。它发生的种类繁多 电话,各种运营商,以及数百名用户。根据服务器端看到的IP地址,它似乎发生在wifi和3G上。
这是轶事但是当我试图在过去2天内在我的Nexus上发生这种情况时,我已经看到它发生了6次,当我进入或离开房间靠近某个wifi路由器时,这些时间总是正确的。剩下的时间,当我在不同的wifi路由器或蜂窝网络上的办公室时,问题永远不会发生。我的理论是应用程序忙于发送数据,现在我们从无线网络转移到网络网络,反之亦然,这是一个愚蠢的想法还是可能性?
如果有人想看看,我可以将tcpdump文件和数据文件放到某处。
我还应该调查什么来找出原因?
答案 0 :(得分:0)
上传二进制数据时我遇到了类似的问题。我发现这是服务器代码的问题。 服务器端有一些过滤器,它们正在读取传入的请求并尝试记录它们。代码试图将传入流放入一些String类型的DS中。正因为如此,二进制图像被扭曲了。 只需检查服务器端是否有任何过滤器。希望这有帮助