我正在尝试通过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";
});
答案 0 :(得分:1)
我认为您消耗了两次请求正文。如果请求内容被消耗了一次,那么您将无法再像这样那样再次消耗字节/流,而无需某种显式的重置机制。
您应该删除第一条语句,以便第二条语句能够使用输入流。
1. byte[] body = request.bodyAsBytes(); // Remove this
2. try (InputStream is = request.raw().getPart("image").getInputStream())