Java 文件上传速度慢得令人痛苦
Java file uploading painfully slow
我构建了一个小型服务,它从 Android 设备接收图像并将它们保存到 Amazon S3 存储桶中。代码非常简单,但速度非常慢。它是这样的:
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 ”。其余代码也运行顺利,我终于可以在客户端获得响应。
所以,我的问题是为什么 request.raw().getParts()
最多需要 6 分钟,即使上传已完成。
从客户端 (android/ ios),尝试发送文件块,而不是发送整个文件。服务器将接收这些块,合并并创建一个文件。
让它更快。从客户端使用多线程发送块。
或使用一些库进行上传,例如 https://github.com/square/okhttp or https://github.com/koush/AndroidAsync
听起来好像从 Android 端发送数据的应用程序在完成发送数据后没有关闭连接。
这将导致两端坐在那里什么也不做,直到其中一个读取超时触发。
您是自己在 Android 设备上编写代码,还是使用浏览器或某些第三方应用程序?
我构建了一个小型服务,它从 Android 设备接收图像并将它们保存到 Amazon S3 存储桶中。代码非常简单,但速度非常慢。它是这样的:
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 ”。其余代码也运行顺利,我终于可以在客户端获得响应。
所以,我的问题是为什么 request.raw().getParts()
最多需要 6 分钟,即使上传已完成。
从客户端 (android/ ios),尝试发送文件块,而不是发送整个文件。服务器将接收这些块,合并并创建一个文件。
让它更快。从客户端使用多线程发送块。
或使用一些库进行上传,例如 https://github.com/square/okhttp or https://github.com/koush/AndroidAsync
听起来好像从 Android 端发送数据的应用程序在完成发送数据后没有关闭连接。
这将导致两端坐在那里什么也不做,直到其中一个读取超时触发。
您是自己在 Android 设备上编写代码,还是使用浏览器或某些第三方应用程序?