IOException:缺少多部分请求的内容

时间:2018-11-15 17:37:08

标签: java android apache-spark heroku okhttp

我正在尝试通过POST请求将图像从Android应用发送到Heroku网络服务器。在Web服务器中,我想从请求中检索图像,进行修改,然后将修改后的图像作为响应发送回去。

但是,我当前的代码在网络服务器中返回IOException

  

java.io.IOException:缺少多部分请求的内容   org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:496)org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:405)

我检查了一下,并且userImageFile至少确实存在于Android应用中。

这是我在Android应用中的代码(使用OkHttp)。

    //Creating file with the bitmap gotten from the user
    String path = this.getFilesDir().getAbsolutePath();
    File userImageFile = new File(path + "/image.png");
    userImageFile.createNewFile();
    FileOutputStream fop = new FileOutputStream(userImageFile, false);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fop);
    fop.flush();
    fop.close();

    OkHttpClient okHttpClient = new OkHttpClient();
    String url = "https://my-heroku-app-url-here.com/imageConvert";
    RequestBody body = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("image", userImageFile.getName(),
                    RequestBody.create(MediaType.parse("image/png"), userImageFile))
            .build();

    Request request = new Request.Builder()
            .url(url)
            .post(body)
            .build();

    Response response = okHttpClient.newCall(request).execute();

这是我的Heroku Web服务器代码(使用Spark框架)。

post("/imageConvert", (request, response) -> {
        byte[] body = request.bodyAsBytes();
        request.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("/temp"));
        BufferedImage returnImage = null;
        try (InputStream is = request.raw().getPart("image").getInputStream()) {
            BufferedImage userImage = ImageIO.read(is);
            returnImage = getDistortedImage(userImage);
        }catch (IOException ex){
            return "There has been an IO Exception: \n" + ex.getMessage();
        }
        if(returnImage!= null){
            ImageIO.write(returnImage, "png", response.raw().getOutputStream());
            return response.raw();
        }
        return "There was an unknown mistake";
    });

1 个答案:

答案 0 :(得分:1)

我认为您消耗了两次请求正文。如果请求内容被消耗了一次,那么您将无法再像这样那样再次消耗字节/流,而无需某种显式的重置机制。

您应该删除第一条语句,以便第二条语句能够使用输入流。

1. byte[] body = request.bodyAsBytes();  // Remove this

2. try (InputStream is = request.raw().getPart("image").getInputStream())