如何使用Python从Google App Engine显示pdf blob

时间:2012-08-08 05:04:42

标签: python google-app-engine blobstore

关于StackOverflow的第一个问题。 。

在使用python的Google App Engine应用程序中,我试图在页面上与html一起显示一个小的pdf图像。

我有一个小班,写得像这样:

class modelReport(db.Model):
    Applicant = db.StringProperty()
    Reportblob = db.BlobProperty()

小表单用于上传图像并将图像提交给以下处理程序:

class UploadResults(webapp.RequestHandler):
    def post(self):
        m = modelReport()
        m.Applicant = self.request.get("txtApplicantName")
        Reportblob = self.request.get("file")
        m.Reportblob = db.Blob(Reportblob)
        m.put()

我正在使用以下代码显示申请人的图片和名称:

class RetrieveResults(webapp.RequestHandler):
    def get(self):
        self.response.out.write('''
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="em">
        <head>
        <meta http-equiv="Content-Type" content="application/pdf" />
        <title>Results Page</title>
        </head>
        <body>
        ''')
        reports = db.GqlQuery('SELECT * FROM modelReport')
        for report in reports:
            self.response.out.write('</p><b>%s</b> report is:' % report.Applicant)
            self.response.out.write("<div><img src='img?img_id=%s'></img>" % report.key())
        self.response.out.write('''
        </body></html>
        ''')

使用开发服务器Datastore Viewer时,我可以看到列出Key,Write Ops,ID,Key Name,Applicant和Reportblob的新'modelReport'实体。

问题是输出列出申请人,然后显示一个带有“?”的小蓝框在中间,它找不到图像文件。 。 。并且,开发服务器日志控制台显示404错误:

INFO..."GET /retrieve_results/all_results HTTP/1.1" 200 -
INFO..."GET /retrieve_results/img?img_id=ag...Aww HTTP/1.1" 404 -
INFO..."GET /retrieve_results/img?img_id=ag...BQw HTTP/1.1" 404 -
INFO..."GET /retrieve_results/img?img_id=ag...Bgw HTTP/1.1" 404 -

我想了一段时间我可能会使用错误的“内容类型”标题,但使用Apache Web服务器的类似代码显示文本和图像就好了。

好像我可能会制作空的blobstore属性“Reportblob”,但我不知道如何验证或调试。

非常感谢任何或所有帮助修复GAE代码。

1 个答案:

答案 0 :(得分:2)

首先犯了几个错误:

  1. 您的HTML页面不是PDF文档,因此您无法将其内容类型声明为pdf:

    <meta http-equiv="Content-Type" content="application/pdf" />
    

    相反它应该像

    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    
  2. PDF文档不是图片,您不能只将src指向PDF文档Url并期望它显示:

    <div><img src='img?img_id=%s'></img>
    
  3. 只是检查:我假设您/img?img_id=<..>有{{1}}处理程序?

  4. 您需要做什么:

    1. 确保正确提供blob,如上面第3点的链接所述。

    2. 查看有关如何将PDF文档正确嵌入HTML页面的所有选项:serve images from blobstore(最简单的是Recommended way to embed PDF in HTML?