我需要从GAE数据存储区读取几兆字节(原始文本字符串),然后将它们全部写入新的PDF文件,然后将PDF文件提供给用户下载。
我很清楚沙盒限制阻止您写入文件系统。我想知道是否有一种狡猾的方式来创建内存中的PDF(或内存和blobstore的组合),然后以某种方式存储它,以便客户端(浏览器)实际上可以将其作为文件下拉并保存在当地。
这可能是一个巨大的延伸,但我唯一的另一个选择是将此任务转移到非GAE服务器,我想不惜一切代价避免,即使我需要进行大量额外的开发。提前谢谢。
答案 0 :(得分:3)
使用GAE本身绝对可以实现您的使用案例。以下是您应该在高级别遵循的步骤:
下载优秀的iText library,这是一个用于处理PDF的Java库。首先构建Java代码以生成PDF内容。查看以下各种示例:http://itextpdf.com/book/toc.php
由于无法直接写入文件,因此需要以字节为单位生成PDF内容,然后编写一个Servlet作为下载Servlet。 Servlet将使用Response对象打开流,操纵Mime Headers(文件名,文件类型)并将PDF内容写入流。当您这样做时,浏览器将自动显示下载选项。
您的下载Servlet将具有如下所示的高级代码:
public class DownloadPDF extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
//Extract some request parameters, fetch your data and generate your document
String fileName = "<SomeFileName>.pdf";
res.setContentType("application/pdf");
res.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
writePDF(<SomeObjectData>, res.getOutputStream());
}
}
}
请记住上面的writePDF方法是您自己的方法,您可以使用iText库Document和其他类生成数据,并将其写入您在第二个参数中传递的输出流。
答案 1 :(得分:2)
虽然我不知道Google App Engine上的PDF生成,特别是Java,但是一旦你拥有它,你肯定可以存储它并在以后提供它。
我认为PDF的生成时间将超过30秒,因此您必须考虑使用Task Queue Java API进行此过程。
将文件保存在内存中后,您可以简单地write it to the Blobstore,然后将其作为常规blob提供。在overview中,您将找到有关如何在Google App Engine上上传,编写和提供二进制数据(blob)的完整功能示例。
答案 2 :(得分:0)
我通过谷歌搜索找到了几个解决方案。请注意,我实际上没有尝试过这些库,但希望它们会有所帮助。