【发布时间】:2014-06-05 00:35:53
【问题描述】:
最终更新(请参阅 cmets)
由于 GAE 的限制,我已经放弃了实现自己的 QR 生成器。以前的 Google Charts API 服务仍然可以使用,并且还可以使用 ZXing 的 servlet 进行复制。有关更多详细信息,请参阅此link。谢谢你的回答。
更新 2(见下面的原始问题)
所以我挖掘了 ZXing 的源代码,他们似乎在所有流程中都使用了 BufferedImage。我现在的问题可以表述为:
- 有没有办法将 ZXing 与 Google App Engine 结合使用?
- 有什么方法可以在 servlet 中生成 QR 码 部署到 Google App Engine?
更新(见下面的原始问题)
以下行显然会导致错误:
MatrixToImageWriter.writeToStream(encoded, "png", outs);
它似乎正在使用 BufferedImage。是否可以在不执行此步骤的情况下将 BitMatrix 转换为 byte[]?
原问题
我正在尝试在 Google App Engine 上创建一个 servlet,以返回具有给定参数的 QR 码。到目前为止,我已经使用 QRGen 和 ZXing 创建了解决方案,它们在 App Engine 本地开发模式下测试时可以完美运行。我的问题是,在我将 servlet 部署到 App Engine 后,这两种实现都失败了,说要么
无法初始化类 com.google.apphosting.runtime.security.shared.stub.java.awt.image.BufferedImage
或
java.awt.Image 是一个受限类。请参阅谷歌应用引擎 开发者指南了解更多详情。
我不完全了解这些工具在内部是如何工作的,我知道 Class whitelist 上没有 java.awt.image 类。我的问题是,有没有办法绕过这个安全功能,并实际上从 servlet 返回一个 QR 码。这是我使用 ZXing(它似乎提供比 QRGen 更多的选项)的最新实现(在开发模式下运行良好,但在部署的 servlet 上也失败):
@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());
}
【问题讨论】:
-
您是否排除了在客户端生成图像的可能性,例如 larsjung.de/qrcode/">jquery.qrcode</a>?
-
是的,我肯定想在服务器端做。
标签: java google-app-engine servlets zxing qr-code