2011-04-08 29 views
1

我們遇到了從iPhone上傳圖片到我們的後端(雲)服務的問題。這個調用是一個簡單的HTTP文件上傳,問題似乎是上傳完成之前的連接中斷 - 在服務器端,我們得到IOError:客戶端讀取錯誤(超時?)。iPhone:將大型文件從電話上傳到服務器的策略

偶爾會出現這種情況:大部分時間都有效,有時會失敗。當一個良好的連接(即無線),它總是工作。

我們已經調整了客戶端庫上的各種超時參數,以確保我們沒有碰到任何超時參數。這個問題實際上似乎是不可靠的移動連接。

我正在考慮即使遇到連接不暢也使上傳可靠的策略。

首先想到的是將文件分割成更小的塊並將其分塊傳輸,從而增加了每個塊到達那裏的可能性。但是這在客戶端和服務器端引入了相當複雜的一點。

你有更聰明的方法嗎?你將如何解決這個問題?

+0

我們說多少? 5 megs? 20 megs? – 2011-04-09 04:35:03

+0

這是一個500萬像素的相機,圖片往往在1-3兆之間。 – Parand 2011-04-10 18:13:15

回答

0

是的,超時一般是棘手的,在處理移動連接時會變得更加複雜。

這裏有幾個想法:

  1. 嘗試上傳到您的雲服務,你在做什麼。在幾次失敗(超時)後,標記文件,並要求用戶將手機連接到WiFi網絡,或等待他們連接到計算機,並通過網絡手動上傳。但這並不理想,因爲它會將更多工作推向用戶。實施方面的好處是,它非常簡單。

  2. 而不是做HTTP上傳,而是做一個原始套接字發送。使用原始套接字,您可以非常容易地發送二進制數據塊,並且如果有任何塊發送超時,請重新發送,直到發送完整的圖像文件。這是「更復雜」,因爲您必須管理二進制套接字傳輸,但我認爲這比通過HTTP上傳來分塊文件更容易。

無論如何,這就是我將如何接近它。

+0

謝謝艾倫。我們已經做了1,但如果可能的話,我想讓非WiFi可靠。對於2,如果我們使用原始套接字路由,則必須在http之外完成服務器部分,這會引入各種有趣的摺痕 - 穿過防火牆,反向代理等。至少使用http分塊,我們可以使用大多數的現有基礎設施。 – Parand 2011-04-08 20:33:37

1

我會使用ASIHTTPRequest庫。它有一些很棒的功能,比如帶寬限制。它可以直接從系統上傳文件,而不是先將文件加載到內存中。我也會把照片分成10份。所以對於一張5兆的照片來說,每張照片都是500k。您只需創建每個上傳using a queue。然後當應用程序進入後臺時,它可以完成它當前正在上傳的部分。如果您無法在分配的時間內完成所有部件的上傳,只需發佈​​本地通知,提醒用戶未完成。然後,在將所有部分發送到服務器之後,您可以調用最終請求,將所有部分合併到服務器端的照片中。

+1

+1爲ASIHTTPRequest - 偉大的圖書館。 – Moshe 2011-04-11 03:21:49

+0

我們正在使用ASIHTTPRequest。看起來核心問題可能與AT&T的網絡有關,我們現在正在測試解決方法(請參閱http://groups.google.com/group/asihttprequest/browse_thread/thread/c5805a53a04eb2e8) – Parand 2011-04-19 18:58:20