如何使用Jetty HTTP客户端和MultiPartContentProvider上传BufferedImage?

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

如何使用Jetty HTTP客户端和MultiPartContentProvider上传BufferedImage?

通过以下代码:

@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()通话结婚

xialz 回答:如何使用Jetty HTTP客户端和MultiPartContentProvider上传BufferedImage?

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

请参见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,output);
 }
本文链接:https://www.f2er.com/3158948.html

大家都在问