¿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?
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 devolverResponseEntity<byte[]>
. Aquí te mostramos cómo puedes modificar tu método:En este método modificado, generas el código QR como un
BufferedImage
y luego lo conviertes en un arreglo de bytes utilizandoByteArrayOutputStream
. Luego creas un objetoHttpHeaders
y estableces el tipo de contenido y la disposición comoMediaType.IMAGE_PNG
e “inline”, respectivamente. Finalmente, creas un objetoResponseEntity
y lo devuelves como una respuesta HTML con el arreglo de bytes como cuerpo.</byte[]></byte[]>