我已經構建了一個小型服務,它從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分鐘,即使在上傳完成。
我不能回答這個確切的問題,但我碰巧做用改造Scala的完全一樣的東西,它的工作出色。您是否嘗試過通過.getParts()進行調試? – Ewald
所以你說這個問題可能在客戶端(即Android的Http庫)? –
我在想,如果這不是問題,我首先會嘗試從服務器上傳本地文件到S3,看看它是服務器代碼還是Android代碼。如果你在Android上執行二進制上傳錯誤,你最終會發送字節數據字節,這可能會造成傷害! – Ewald