【问题标题】:How to upload a BufferedImage using Jetty HTTP client and MultiPartContentProvider?如何使用 Jetty HTTP 客户端和 MultiPartContentProvider 上传 BufferedImage?
【发布时间】:2020-03-01 22:23:11
【问题描述】:

使用 Jetty 9.4.21.v20190926,我运行了一个自定义 servlet(一个 WAR 文件),它能够生成像这样的图像:

通过以下代码:

@Override
protected void doGet(HttpServletRequest httpReq, HttpServletResponse httpResp) throws ServletException, IOException {
    BufferedImage image = new BufferedImage(512, 512, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = image.createGraphics();
    // ...drawing code skipped here...
    g.dispose();
    httpResp.setStatus(HttpServletResponse.SC_OK);
    httpResp.setContentType("image/png");
    ImageIO.write(image, "png", httpResp.getOutputStream());
}

这很好用,现在我想向我的 servlet 添加另一个功能:uploading the same image by HTTP POST to another website(我会通过每小时 cronjob 调用我的 servlet 上的 URL 来触发上传)。

我明白,我应该使用MultiPartContentProvider 和以下代码:

MultiPartContentProvider multiPart = new MultiPartContentProvider();
multiPart.addFilePart("attached_media", "img.png", new PathContentProvider(Paths.get("/tmp/img.png")), null);
multiPart.close();

但是我不希望将生成的图像保存为临时文件。

相反,我想使用BytesContentProvider 或者InputStreamContentProvider……但是如何他们与ImageIO.write() 通话?

【问题讨论】:

    标签: java servlets jetty javax.imageio jetty-9


    【解决方案1】:

    您是否尝试在您的multipart.addFilePart() 中使用OutputStreamContentProvider 而不是PathContentProvider

    https://www.eclipse.org/jetty/javadoc/current/org/eclipse/jetty/client/util/OutputStreamContentProvider.html

    那么你就可以使用ImageIO.write(image, "png", outputStreamContentProvider);

    例子:

    HttpClient httpClient = ...;
    
     // the output for the image data
     OutputStreamContentProvider content = new OutputStreamContentProvider();
     MultiPartContentProvider multiPart = new MultiPartContentProvider();
     multiPart.addFilePart("attached_media", "img.png", content, null);
     multiPart.close();
     // Use try-with-resources to autoclose the output stream
     try (OutputStream output = content.getOutputStream())
     {
         httpClient.newRequest("localhost", 8080)
                 .content(multipart)
                 .send(new Response.CompleteListener()
                 {
                     @Override
                     public void onComplete(Result result)
                     {
                         // Your logic here
                     }
                 });
    
         // At a later time...
         ImageIO.write(image, "png", output);
     }
    

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 2021-01-06
      • 2017-10-12
      • 2017-05-31
      相关资源
      最近更新 更多