我正在使用Jersey(org.glassfish.jersey - 版本2.22.2) - JAX-RS,Guice和图像上传的实现方法:
@PUT
@Path("/image")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public ImageResponse putImage(@FormDataParam("image") InputStream uploadedInputStream) {
writeToFileWithOutputStream(uploadedInputStream);
return null;
}
private void writeToFileWithOutputStream(InputStream uploadedInputStream) {
try {
OutputStream out = new FileOutputStream(new File("xxx.jpg"));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
当我使用writeToFileWithOutputStream方法写入文件时,我得到的文件没有作为图像打开。它包括:
------WebKitFormBoundary5PVRYeRUBBAFA9yi
Content-Disposition: form-data; name="image"; filename="images.jpg"
Content-Type: image/jpeg
/** image symbols **/
------WebKitFormBoundary5PVRYeRUBBAFA9yi
Content-Disposition: form-data; name=""
------WebKitFormBoundary5PVRYeRUBBAFA9yi--
如果我手动删除前4行,图片会正确打开。
我尝试使用BufferedReader / Writer处理它们,但由于Corrupted files uploaded on REST method call
而导致格式错误还尝试使用ImageIO.read(inputStream),但它返回null。
处理接收到的图像InputStream并将其另存为图像(jpg,png或其他格式)的最佳方法是什么?
答案 0 :(得分:2)
<强> 1。代码: 接收带有泽西的图像时,收到的流不是字符串,而是您可能读取的InputStream:
@OPTION
@Path("/image")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response putImag_opts(
@FormDataParam("image") InputStream stream,
@FormDataParam("image") FormDataContentDisposition fileDetail){
return Response.ok().build();
}
@PUT
@Path("/image")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response putImage(
@FormDataParam("image") InputStream stream,
@FormDataParam("image") FormDataContentDisposition fileDetail
) {
writeToFileWithOutputStream(stream);
//if ok...
return Response.ok().build();
}
<强>的信息:强>
- 对象stream
是收到的流,
- 对象fileDetail
包含文件信息
<强> 2。依赖项: 另请检查您是否具有上传图像的正确依赖关系:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.22.2</version>
</dependency>
第3。在您的app类中注册
在App.class球衣中注册内容多部分
register(MultiPartFeature.class);
答案 1 :(得分:0)
问题在于不同的Jersey版本 - 外部jar lib中的版本1和主项目中的Jersey 2。在主项目中切换到Jersey 1,现在图像被保存并正确打开而无需额外处理。此外,当两个参数一起使用时也不例外:
@FormDataParam("image") InputStream uploadedInputStream,
@FormDataParam("image") FormDataContentDisposition fileDetail