Java文件上传速度很慢

时间:2016-02-10 19:07:43

标签: java android servlets spark-java

我已经构建了一个小型服务,可以从Android设备接收图像并将其保存到Amazon S3 Bucket。代码很简单,但速度很慢。它是这样的:

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网络监视​​器),服务器在处理下一行并打印“3.3”之前需要3到4分钟。其余的代码也可以顺利运行,最终我可以得到客户端的响应。

所以,我的问题是为什么request.raw().getParts()最多需要6分钟,即使上传完成也是如此。

2 个答案:

答案 0 :(得分:1)

从客户端(android / ios),尝试发送文件块,而不是发送整个文件。服务器将接收这些块,组合并创建文件。

使速度更快。从客户端使用多个线程发送块。

或使用某些库进行上传,例如https://github.com/square/okhttphttps://github.com/koush/AndroidAsync

答案 1 :(得分:1)

听起来好像从Android端发送数据的应用程序在完成发送数据时没有关闭连接。

这会导致两端无效,直到其中一个读取超时触发。

您是否自己在Android设备上编写了代码,或者您使用的是浏览器或某些第三方应用?