2011-03-15 51 views
1

从我的应用我将文件上传到使用这个基本的代码我们的服务器(这是比这当然是有点多,但是这基本上是它)HttpPost文件上传数据丢失

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服务器代码的Web 问题。

我们还使用tcpdump从手机中检查了数据。来自手机的tcpdump文件与我们尝试发送的数据不同。对于一个案例,我们对tcpdump文件进行了分析,该文件缺少地址8d68和9000之间的数据。来自tcpdump的数据包与这些地址对齐(一个数据包有一部分数据直到8d68,然后下一个数据包的数据从9000开始)。

对于这些手机,问题只发生在某些时间。有时候, 文件上传工作,并在我们的最后收到完整的文件。

这仅发生在2.2+手机上。它发生在手机和各种运营商以及数百个用户的各种各样的 。它似乎根据在服务器端看到的IP地址在wifi和3G上发生。

这是个轶事,但当我试图让我的Nexus在过去2天发生这种情况时,我已经看到它发生了6次,而且当我进入或离开房间接近某个wifi时,这些时间总是正确的路由器。当我在一个不同的无线路由器或单元网络中的办公室时,这一天的其余时间都不会发生。我的理论是,该应用程序正在忙于发送数据,现在我们从无线网络转移到网络网络,反之亦然,这是一种愚蠢的想法还是一种可能性?

我可以把tcpdump文件和数据文件放在任何地方,如果有人在意看一看。

还有什么我应该调查找出原因呢?

+0

正如我已经说过的,如果您可以在手机上重复此错误,请安装tcpdump并查看究竟是什么离开了您的手机。这样你就可以确定它不是应用程序 – Alex 2011-03-21 07:24:28

+0

嗨,Alex,我终于弄清楚了如何重现手机上的错误,并在手机上使用tcpdump捕获结果。 tcpdump与我试图发送的文件不同(我编辑了上面的原始问题与细节)。任何想法现在要尝试什么?其实 – dweebo 2011-05-07 02:19:27

+0

挺奇怪。如果您在手机上运行tcpdumb,它会记录手机发送的内容。怀疑它与你的网络有什么关系。你可以尝试使用httpmime以外的东西。使用流。通过这种方式,你可以100%确定自己发送正确的数据,而不依赖于其他库。我自己会先做它......然后如果它仍然发生。一个祈祷也许? :) – Alex 2011-05-08 19:35:44

回答

0

我在上传二进制数据时遇到了一些类似的问题。我发现这是服务器代码的问题。 服务器端有一些过滤器,它们正在读取传入的请求并尝试记录它们。该代码试图将传入的流放入某些字符串类型的DS中。正因为如此,二进制图像被扭曲了。 只需检查服务器端是否有任何过滤器。希望这可以帮助