2014-06-07 12 views
6

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()); 
    } 
} 
+0

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ô. –

+0

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. –

+0

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(). –

Trả lời

6

Sử dụng response.getĐể có được một luồng đầu ra nên được sử dụng để ghi PNG tới (sử dụng MatrixToImageWriter).

9

Chỉ cần thực hiện điều này. Bạn có thể viết bất kỳ tệp/dữ liệu nhị phân/luồng đầu ra nào bằng cách sử dụng mã sau:

byte[] bytes = Files.readAllBytes(Paths.get(filePath));   
HttpServletResponse raw = res.raw(); 

raw.getOutputStream().write(bytes); 
raw.getOutputStream().flush(); 
raw.getOutputStream().close(); 


return res.raw(); 
+3

Bạn có thực sự phải tuôn ra và đóng luồng đầu ra không? Người đã mở nó nên đóng nó lại. Nếu điều này khác, bạn có thể giải thích tại sao không? – Suma

Các vấn đề liên quan