Как загрузить BufferedImage, используя Jetty HTTP-клиент и MultiPartContentProvider? - PullRequest
0 голосов
/ 05 ноября 2019

В Jetty 9.4.21.v20190926 я запускаю собственный сервлет (WAR-файл), который может генерировать изображения, подобные этому:

generated image

по следующему коду:

@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());
}

Это работает хорошо, и теперь я хотел бы добавить еще одну функцию в мой сервлет: загрузка того же изображения по HTTP POST на другой веб-сайт (Я бы инициировал загрузку, вызвав 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() звонить?

1 Ответ

1 голос
/ 05 ноября 2019

Вы пытались использовать 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, "png", output);
 }
...