图片上传保存的REST方法-InputStream处理成图片格式jpg、png

REST method for image uploading and saving - InputStream processing to image format jpg, png

我正在使用 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 处理它们,但由于

格式不正确

也尝试使用 ImageIO.read(inputStream) 但它 returns 无效。

处理接收到的图像 InputStream 并将其保存为图像(jpg、png 或其他格式)的最佳方法是什么?

1.代码: 当接收带有球衣的图像时,接收到的流不是 String 而是 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。在您的应用程序中注册 class

在您的 App.class 球衣

中注册内容多部分
register(MultiPartFeature.class);

问题是因为不同的 Jersey 版本 - 外部 jar 库中的版本 1 和主项目中的 Jersey 2。在主项目中切换到 Jersey 1,现在无需额外处理即可正确保存和打开图像。此外,当 2 个参数一起使用时也不例外:

@FormDataParam("image") InputStream uploadedInputStream,
@FormDataParam("image") FormDataContentDisposition fileDetail