2016-02-10 68 views
4

我已經構建了一個小型服務,它從Android設備接收圖像並將它們保存到Amazon S3 Bucket。代碼非常簡單,但速度很慢。它是這樣的:Java文件上傳緩慢

public synchronized static Response postCommentPicture(Response response, Request request){ 
    JsonObject ret = new JsonObject(); 
    OutputStream outputStream; 
    String meepId = request.params(":id"); 
    System.out.println("1"); 
    if(meepId == null){ 
     ret.addProperty("Error", "Missing meep id"); 
     response.body(ret.getAsString()); 
     return response; 
    } 
    try { 
     System.out.println("2"); 
     //Chequeamos que vengan los datos del sender 
     Map<String, String> urlData = Utils.splitQuery(request.queryString()); 
     if(!urlData.containsKey("senderName") || !urlData.containsKey("senderId")) 
      throw new Exception("senderName or senderId missing"); 
     System.out.println("3"); 
     MultipartConfigElement multipartConfigElement = new MultipartConfigElement("/temp"); 
     System.out.println("3.1"); 
     request.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement); 
     System.out.println("3.2"); 
     Collection<Part> files = request.raw().getParts(); 
     System.out.println("3.3"); 
     if(files.size() == 0 || files.size() > 1){ 
      throw new Exception("No files or more than 1 file detected"); 
     } 
     //Rest of the code... 
    } catch (Exception e2){ 
     System.out.println(e2.getMessage()); 
     ret.addProperty("Error", e2.getMessage());   
    } finally { 
     response.body(ret.toString()); 
     return response; 
    } 

所以,你可以看到,我打印的某些步驟日誌。代碼運行順利,直到「3.2」開始從客戶端設備傳輸文件。因此,完成傳輸需要一些時間,但一旦完成上傳(正如我可以使用Android Studio Network Monitor所述),服務器在處理下一行並打印「3.3」之前需要多3分鐘。其餘的代碼運行也很順利,我終於可以得到響應客戶端。

所以,我的問題是,爲什麼request.raw().getParts()需要長達6分鐘,即使在上傳完成。

+0

我不能回答這個確切的問題,但我碰巧做用改造Scala的完全一樣的東西,它的工作出色。您是否嘗試過通過.getParts()進行調試? – Ewald

+0

所以你說這個問題可能在客戶端(即Android的Http庫)? –

+1

我在想,如果這不是問題,我首先會嘗試從服務器上傳本地文件到S3,看看它是服務器代碼還是Android代碼。如果你在Android上執行二進制上傳錯誤,你最終會發送字節數據字節,這可能會造成傷害! – Ewald

回答

1

聽起來好像其被從Android端發送所述數據的應用未關閉連接時,它完成發送的數據。

這將導致兩端坐在那裏什麼都不做,直到讀超時觸發之一。

你寫過的Android設備上自己的代碼,或者您使用的瀏覽器或一些第三方應用程序?

+0

我認爲這可能是正確的,我從來沒有關閉使用HttpClient時的連接,謝謝。 –

1

從客戶端(安卓/ IOS),嘗試發送的文件塊,而不是發送整個文件。服務器將接收這些塊,合併並創建一個文件。

讓它更快。從客戶端使用多個線程發送塊。

,或者使用某些庫上傳等https://github.com/square/okhttphttps://github.com/koush/AndroidAsync

+0

我認爲文件/多部分數據是通過塊發送的。無論如何,我解決了將客戶端庫更改爲OkHttp。 –

+0

完美!抱歉,剛剛看到您對分享代碼的評論。你還想要嗎? –