Google App Engine-生成QR码

问题描述 投票:2回答:1

最终更新(请参阅评论)

由于GAE的限制,我已放弃实施自己的QR生成器。 以前的Google Charts API服务仍然可以使用,也可以使用ZXing的servlet复制。 有关更多详细信息,请参见此链接 。 谢谢你的回答。


更新2(请参阅下面的原始问题)

因此,我深入研究了ZXing的源代码,他们似乎在所有过程中都使用BufferedImage。 我的问题现在可以表述为:

  • 有什么办法可以将ZXing与Google App Engine一起使用?
  • 有什么方法可以在可以部署到Google App Engine的servlet中生成QR代码吗?

更新(请参阅下面的原始问题)

以下行显然会导致错误:

MatrixToImageWriter.writeToStream(encoded, "png", outs);

似乎正在使用BufferedImage。 是否可以在不执行此步骤的情况下将BitMatrix转换为byte []?


原始问题

我正在尝试在Google App Engine上创建一个servlet,以返回具有给定参数的QR码。 到目前为止,我已经使用QRGenZXing创建了解决方案,它们在App Engine 本地开发模式下进行测试时可以完美地工作。 我的问题是,在将servlet部署到App Engine后,这两种实现都失败了,原因是

无法初始化com.google.apphosting.runtime.security.shared.stub.java.awt.image.BufferedImage类

要么

java.awt.Image是一个受限类。 有关更多详细信息,请参阅Google App Engine开发人员指南。

我不完全了解这些工具如何在内部工作,我知道java.awt.image类不在Class白名单上 。 我的问题是,有什么方法可以绕过此安全功能,并实际上从Servlet返回QR码。 这是我最新的使用ZXing的实现(在开发模式下可以正常工作,但在部署的servlet上也失败),它比ZXing似乎提供更多的选择。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
    String returnString = "myString";

    Writer writer = new QRCodeWriter();
    BitMatrix encoded = null;
    try
    {
        encoded = writer.encode(returnString, BarcodeFormat.QR_CODE, 300, 300);
    } 
    catch (WriterException ex)
    {
        Logger.getLogger(QRService.class.getName()).log(Level.SEVERE, null, ex);
    }

    ByteArrayOutputStream outs = new ByteArrayOutputStream();
    MatrixToImageWriter.writeToStream(encoded, "png", outs);
    byte[] out = outs.toByteArray();

    Blob qrImage = new Blob(out);
    resp.setContentType("image/jpeg");
    resp.getOutputStream().write(qrImage.getBytes());
}
java google-app-engine servlets zxing qr-code
1个回答
3
投票

在这里,查看Google Charts API

https://developers.google.com/chart/infographics/docs/qr_codes

似乎它允许您使用简单的HTTP GET请求创建QR码。 要在App Engine中创建HTTP GET请求,请尝试以下操作:

https://developers.google.com/appengine/docs/java/urlfetch/

© www.soinside.com 2019 - 2024. All rights reserved.