es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puedo devolver BufferedImage como respuesta HTML?

Tengo la siguiente implementación para crear un código QR e intentar devolver el código generado como una respuesta HTML (solicitar al usuario que abra o guarde la imagen generada) en lugar de guardarla en un directorio. Sin embargo, no pude lograrlo. Estoy utilizando el siguiente ejemplo en Baeldung: https://www.baeldung.com/java-generating-barcodes-qr-codes

public static BufferedImage generateQRCodeImage(String barcodeText) throws Exception {
    QRCodeWriter barcodeWriter = new QRCodeWriter();
    BitMatrix bitMatrix = 
      barcodeWriter.encode(barcodeText, BarcodeFormat.QR_CODE, 200, 200);

    return MatrixToImageWriter.toBufferedImage(bitMatrix);
}

Utilizo el siguiente método del controlador REST:

@RestController
@RequestMapping("/barcodes")
public class BarcodesController {

    @GetMapping(value = "/barbecue/ean13/{barcode}", produces = MediaType.IMAGE_PNG_VALUE)
    public ResponseEntity<bufferedimage> barbecueEAN13Barcode(@PathVariable("barcode") String barcode)
        throws Exception {
        return okResponse(BarbecueBarcodeGenerator.generateEAN13BarcodeImage(barcode));
    }
    //...
}

Sin embargo, no puedo obtener la imagen como una respuesta HTTP. Entonces, ¿cómo puedo solucionarlo?

Actualización: Aquí está mi Application.java:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public HttpMessageConverter<bufferedimage> createImageHttpMessageConverter() {
        return new BufferedImageHttpMessageConverter();
    }
}

¿Es suficiente? ¿O debo llamarlo desde algún lugar?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para devolver el código QR generado como una respuesta HTML, debes modificar el método del Controlador REST. En lugar de devolver ResponseEntity<bufferedimage>, puedes devolver ResponseEntity<byte[]>. Aquí te mostramos cómo puedes modificar tu método:

    @GetMapping(value = "/qr-code/{text}", produces = MediaType.TEXT_HTML_VALUE)
    public ResponseEntity<byte[]> generateQRCode(@PathVariable("text") String text) throws Exception {
        // Generar el código QR como BufferedImage
        BufferedImage image = generateQRCodeImage(text);
    
        // Convertir BufferedImage en un arreglo de bytes
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "png", baos);
        byte[] imageData = baos.toByteArray();
    
        // Crear un objeto HttpHeaders y establecer el tipo de contenido y la disposición
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.IMAGE_PNG);
        headers.setContentDisposition(ContentDisposition.builder("inline").build());
    
        // Crear ResponseEntity y devolverlo como respuesta HTML
        return ResponseEntity.ok().headers(headers).body(imageData);
    }
    

    En este método modificado, generas el código QR como un BufferedImage y luego lo conviertes en un arreglo de bytes utilizando ByteArrayOutputStream. Luego creas un objeto HttpHeaders y estableces el tipo de contenido y la disposición como MediaType.IMAGE_PNG e “inline”, respectivamente. Finalmente, creas un objeto ResponseEntity y lo devuelves como una respuesta HTML con el arreglo de bytes como cuerpo.</byte[]></byte[]>

Comments are closed.