如何在HTTP响应体(使用Spark)中发送QR码的PNG?

我想生成QR码图像,将其转换为PNG并将其作为HTTP响应返回给我的客户端。

为了生成QR码我使用ZXing。 我已经使用带有MatrixToImageWriter.writeToStream(...)FileOutputStream编写了测试转换部分。 这就像一个魅力。

我目前使用的Web框架是Spark (版本1.1.1)。 handle(...) – 方法的返回被设置为响应主体。 我在这做错了什么?

使用当前的解决方案,我得到The image "http://localhost:4567/qrcode" cannot be displayed because it contains errors在使用Firefox执行GET请求时The image "http://localhost:4567/qrcode" cannot be displayed because it contains errors

 import java.io.ByteArrayOutputStream; import java.io.OutputStream; import static spark.Spark.get; import spark.Request; import spark.Response; import spark.Route; import com.google.gson.Gson; import com.google.common.io.BaseEncoding; import com.google.zxing.BarcodeFormat; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; public class App { public static void main(String[] args) { get(new Route("/qrcode") { @Override public Object handle(Request request, Response response) { // Test data QrData data = new QrData("test"); // Data is wrapped in JSON String json = new Gson().toJson(data); // Transform JSON to QR-code PNG byte string String qrString = ""; try { qrString = generatePngQrCode(json); } catch (Exception e) { e.printStackTrace(); } // Set response parameters response.type("image/png"); response.status(200); // Return response body return qrString; } }); } public String generatePngQrCode(String content) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // ZXing QR-code encoding BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, 400, 400); // Convert to PNG image and write to stream MatrixToImageWriter.writeToStream(bitMatrix, "png", outputStream); // Encode to Base 64 return BaseEncoding.base64().encode(outputStream.toByteArray()); } } 

使用response.getRaw获取应该用于将PNG写入的OutputStream(使用MatrixToImageWriter)。

刚刚经历过这个。 您可以使用以下代码编写任何文件/二进制数据/输出流:

 byte[] bytes = Files.readAllBytes(Paths.get(filePath)); HttpServletResponse raw = res.raw(); raw.getOutputStream().write(bytes); raw.getOutputStream().flush(); raw.getOutputStream().close(); return res.raw();