【问题标题】:RESTEASY Image Resize with ImageIo.read(InputStream) returns Null BufferedImageRESTEASY Image Resize with ImageIo.read(InputStream) 返回 Null BufferedImage
【发布时间】:2014-09-20 06:12:05
【问题描述】:

以下是我的问题的详细信息:

问题:我正在使用 RestEasy 从 Multipart Form InputStream 上传调整大小的缩略图。输入到 Scalr.resize 的 BufferedImage 对象返回 NULL 值。在下面的代码中,BufferedImage img 始终为 NULL

你能帮我弄清楚我怎样才能做到这一点。

我的代码片段:

import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.MediaType;

import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
import org.jboss.resteasy.plugins.providers.IIOImageProviderHelper;
import org.neo4j.graphdb.GraphDatabaseService;
import com.kryptonite.aws.AWSHelper;
import com.kryptonite.utils.DAO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import org.imgscalr.Scalr;
:
:
:
:
        @POST
        @Consumes( MediaType.MULTIPART_FORM_DATA )
        public String uploadImage(@MultipartForm InputStream image) throws IOException {
            BufferedImage img = ImageIO.read(image);
            BufferedImage thumbnail = Scalr.resize(img,Scalr.Method.AUTOMATIC, Scalr.Mode.FIT_TO_WIDTH,150, 100, Scalr.OP_ANTIALIAS);
            thumbnail.createGraphics().drawImage(thumbnail, 0, 0, null);
            ImageIO.write(thumbnail, "jpg", new File("/temp/test.jpg"));
             return key;    
        }

【问题讨论】:

  • 查看您的导入,似乎您的代码一次做的事情太多了。尝试将问题分解为更小的、可修复的问题,并一次解决一个问题。就像,不要读取图像缩放等,而是尝试将该输入流直接写入磁盘。尝试在外部程序中打开文件。验证您提供给 ImageIO.read() 的数据是否为有效图像。
  • 额外提示:thumbnail.createGraphics().drawImage(thumbnail, 0, 0, null); 行是 a) 多余的(为什么要在自身上绘制图像?),b) 资源泄漏,因为没有对 Graphics.dispose() 的匹配调用。

标签: image upload resize bufferedimage resteasy


【解决方案1】:

使用 MediaType multipart/form-data,您的请求负载被分成多个部分,可能如下所示:

POST /some-resource HTTP/1.1
Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="description"

... description of the image ...

--AaB03x
Content-Disposition: form-data; name="file"; filename="img1.jpg"
Content-Type: image/jpeg

... content of img1.jpg ...
--AaB03x--

如果您只使用请求的InputStream,您需要自己解析它,但您通常不想使用MultipartFormDataInput 或像您尝试过的@MultipartForm 一样。在这里,您需要将请求有效负载映射到这样的 POJO:

public class ImgUpload {

  @FormParam("description")
  private String description;

  @FormParam("file")
  @PartType("image/jpeg")
  private InputStream file;

}

请同时查看documentationthis example

【讨论】:

  • 抱歉错过了前面的陈述......我确实有一个请求以您提到的格式映射到 POJO。现在我尝试删除 MEDIATYPE MULTIPART FORM DATA。仍然没有运气.. 有没有更好的方法在 RestEasy 中上传图片并在服务器上调整大小?
  • 如何上传图片?可以添加一些客户端代码吗?
【解决方案2】:

经过一番挖掘,这对我有用:

使用 MultipartFormDataInput 作为输入

代码可能类似于:

       Map<String, List<InputPart>> uploadForm = images.getFormDataMap();
        List<InputPart> inputParts = uploadForm.get("uploadedImage");
        InputStream inputStream = null;
        BufferedImage reimg = null;
        for (InputPart inputPart : inputParts) {                     
            try {            
                MultivaluedMap<String, String> header = inputPart.getHeaders();
                if (fileName == null){
                key = "nutped_"+ new Date().getTime()+"_"+getFileName(header);
                } else {
                    key=fileName;
                }
                inputStream = inputPart.getBody(InputStream.class,null);
                InputStream is = new BufferedInputStream(inputStream);
                reimg = Scalr.resize(ImageIO.read(is), Method.SPEED, size, OP_ANTIALIAS, OP_BRIGHTER);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //convert BufferedImage to InputStream
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(reimg, "png", baos);
        InputStream isReimg = new ByteArrayInputStream(baos.toByteArray()); 

【讨论】:

  • 您的代码中的images 是什么?你能发布整个方法吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-08
  • 2016-05-28
  • 2021-12-15
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多