我正在開發一個Android應用程序,它使用戶能夠將文件上傳到像Twitpic和其他服務。 POST上傳完成時沒有任何外部庫,工作得很好。我唯一的問題是,我不能抓住任何進展,因爲所有的上傳完成時,我收到的迴應,而不是寫入字節到輸出流。 這裏是我做的:無法抓取HTTP POST文件上傳(Android)的進度
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
然後我寫的表單數據到DOS,這是不那麼重要的這裏,現在。之後,我寫的文件數據本身(從「中」,這是我要發送的數據的InputStream讀):
while ((bytesAvailable = in.available()) > 0)
{
bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
bytesRead = in.read(buffer, 0, bufferSize);
dos.write(buffer, 0, bytesRead);
}
在那之後,我發了多形式的數據來表示的結束文件。然後,我關閉流:
in.close();
dos.flush();
dos.close();
這一切都工作得很好,迄今沒有問題。然而,我的問題是,無論文件有多大,到目前爲止的整個過程大約需要一兩秒。 上傳本身似乎當我讀到應對發生:
DataInputStream inStream = new DataInputStream(conn.getInputStream());
這需要幾秒鐘或幾分鐘,根據文件的大小以及如何快速的互聯網連接。 我現在的問題是: 1)爲什麼我寫字節到「dos」時不會發生上傳? 2)如何在上傳過程中顯示進度對話框時,如何獲取進度?
/編輯: 1)I組中改變問題了一下頭中的Content-Length,但不以任何 的方式解決這個問題: 現在整個內容的最後一個字節寫入後上傳流。所以,這不會改變你無法獲取進度的情況,因爲數據再次被寫入。 2)我嘗試了Apache HttpClient v4中的MultipartEntity。在那裏你根本沒有OutputStream,因爲當你執行請求時,所有的數據都被寫入。再次,無法取得進展。
有沒有人有任何其他想法如何抓住多部分/形式上傳過程?
也許這個答案會給你一些指點:http://stackoverflow.com/questions/254719/file-upload-with-java-with-progress-bar/470047#470047 – pableu 2010-07-09 15:20:28
@pableu :我研究過這個。問題是:Android SDK中沒有RequestEntity。它是Apache HttpClient 3.1的一部分,它不再被Android使用。現在,我甚至試圖加載新的4.0.1庫,但我看不到在這裏獲得進展的可能性。 還有什麼想法? – Manuel 2010-07-12 15:50:11