2011-03-15 90 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中。正因爲如此,二進制圖像被扭曲了。 只需檢查服務器端是否有任何過濾器。希望這可以幫助