it-swarm.com.de

Wie kann ich ein Bild in der Rest-API in JAVA an den Browser zurückgeben?

Ich möchte ein Bild, während ich eine API wie localhost:8080:/getImage/app/path={imagePath} drücke

Während ich diese API drücke, wird mir ein Bild zurückgegeben.

Ist das möglich?

Eigentlich habe ich das versucht, aber es gibt mir einen FEHLER. Hier ist mein Code,

@GET
@Path("/app")
public BufferedImage getFullImage(@Context UriInfo info) throws MalformedURLException, IOException {
    String objectKey = info.getQueryParameters().getFirst("path");

    return resizeImage(300, 300, objectKey);
}


public static BufferedImage resizeImage(int width, int height, String imagePath)
        throws MalformedURLException, IOException {
    BufferedImage bufferedImage = ImageIO.read(new URL(imagePath));
    final Graphics2D graphics2D = bufferedImage.createGraphics();
    graphics2D.setComposite(AlphaComposite.Src);
    // below three lines are for RenderingHints for better image quality at cost of
    // higher processing time
    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    graphics2D.drawImage(bufferedImage, 0, 0, width, height, null);
    graphics2D.dispose();
    System.out.println(bufferedImage.getWidth());
    return bufferedImage;
}

Mein Fehler,

Java.io.IOException: The image-based media type image/webp is not supported for writing

Gibt es eine Möglichkeit, ein Bild zurückzugeben, während eine URL in Java aufgerufen wird?

6
Sharvil

Sie können IOUtils verwenden. Hier ist ein Codebeispiel.

@RequestMapping(path = "/getImage/app/path/{filePath}", method = RequestMethod.GET)
public void getImage(HttpServletResponse response, @PathVariable String filePath) throws IOException {
    File file = new File(filePath);
    if(file.exists()) {
        String contentType = "application/octet-stream";
        response.setContentType(contentType);
        OutputStream out = response.getOutputStream();
        FileInputStream in = new FileInputStream(file);
        // copy from in to out
        IOUtils.copy(in, out);
        out.close();
        in.close();
    }else {
        throw new FileNotFoundException();
    }
}
2
Nitin Vavdiya

ich habe es nicht getestet, weil ich die Umgebung nicht auf dieser Maschine habe, aber logischerweise sollte es wie folgt funktionieren, als Eingangsstrom lesen und die Methode @ResponseBody Byte [] zurückgeben.

@GET
@Path("/app")
public @ResponseBody byte[] getFullImage(@Context UriInfo info) throws MalformedURLException, IOException {
    String objectKey = info.getQueryParameters().getFirst("path");

    BufferedImage image = resizeImage(300, 300, objectKey);
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageIO.write(image, "jpg", os);
    InputStream is = new ByteArrayInputStream(os.toByteArray());
    return IOUtils.toByteArray(is);
}

UPDATE Je nach Vorschlag von @Habooltak Ana ist es nicht erforderlich, einen Eingabestrom zu erstellen. Der Code sollte wie folgt aussehen 

@GET
@Path("/app")
public @ResponseBody byte[] getFullImage(@Context UriInfo info) throws
MalformedURLException, IOException {
    String objectKey = info.getQueryParameters().getFirst("path");

    BufferedImage image = resizeImage(300, 300, objectKey);
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageIO.write(image, "jpg", os);
    return os.toByteArray();
}
2
Basil Battikhi

Geben Sie einfach ein Dateiobjekt mit den korrekten HTTP-Headern ( Content-Type und Content-Disposition ) zurück. In den meisten Fällen/Umgebungen funktionieren diese.

Pseudocode

File result = createSomeJPEG(); 
/*
 e.g.
 RenderedImage rendImage = bufferedImage;
 File file = new File("filename.jpg");
 ImageIO.write(rendImage, "jpg", file);
*/
response().setHeader("Content-Disposition", "attachment;filename=filename.jpg;");
response().setHeader("Content-Type", "image/jpeg");
return ok(result);

Siehe auch:

1
jschnasse

hier ist eine einfache Lösung:

@GET
@Path("/somePath")
public void getImage(@Context HttpServletResponse res) throws IOException {
    Java.nio.file.Path path = Paths.get("filePath");
    res.getOutputStream().write(Files.readAllBytes(path));
    res.getOutputStream().flush();
}
0
Alireza Dastyar