Tôi muốn tạo một hình ảnh mã QR, chuyển đổi nó sang PNG và trả lại nó dưới dạng phản hồi HTTP cho khách hàng của tôi.Tôi làm cách nào để gửi PNG của mã QR trong cơ thể phản hồi HTTP (với Spark)?
Để tạo mã QR tôi sử dụng ZXing. Tôi đã thử nghiệm phần chuyển đổi bằng cách viết bằng cách sử dụng FileOutputStream
với MatrixToImageWriter.writeToStream(...)
. Điều đó hoạt động như một sự quyến rũ.
Khung web tôi hiện đang sử dụng là Spark (Phiên bản 1.1.1). Sự trở lại của các handle(...)
-method được thiết lập như là cơ thể phản ứng. Tôi làm gì sai ở đây?
Với giải pháp hiện tại, tôi nhận được The image "http://localhost:4567/qrcode" cannot be displayed because it contains errors
khi thực hiện yêu cầu GET với Firefox.
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());
}
}
Tại sao bạn mã hóa base64 byte []? Nếu bạn muốn trả về png, nó cần phải là byte thô. –
Tôi tìm thấy một số nguồn ngụ ý rằng mã hóa cho PNG được cho là Base64 (ví dụ: http://mrbool.com/how-to-convert-image-to-byte-array-and-byte-array-to-image- trong java/25136). Tôi đã thử trả về 'ByteArrayOutputStream' cũng như' toByteArray() ', cả hai đều mang lại kết quả tương tự như chuỗi. –
Bạn có thể viết trực tiếp để phản hồi không? Trang web spark hiện có doc cho 2.0, nhưng cho biết bạn có thể gọi response.raw(). –