用于图像上传和保存的REST方法 - 输入流处理到图像格式jpg,png

时间:2016-05-13 11:42:36

标签: rest jersey inputstream multipartform-data multipart

我正在使用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或其他格式)的最佳方法是什么?

2 个答案:

答案 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