【问题标题】:How to display pdf blob from Google App Engine using Python如何使用 Python 从 Google App Engine 显示 pdf blob
【发布时间】:2012-08-08 05:04:42
【问题描述】:

我关于 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 时,我可以看到新的“modelReport”实体,其中列出了 Key、Write Ops、ID、Key Name、Applicant 和 Reportblob。

问题是输出列出申请人,然后显示一个带有“?”的小蓝色框中间好像找不到图片文件。 . .并且,开发服务器日志控制台显示 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 代码的帮助。

【问题讨论】:

  • 你没有使用 blobstore,你只是在实体中存储一个 blob。
  • 您应该发布 /retrieve_results 的处理程序代码。
  • 欢迎堆栈溢出。

标签: python google-app-engine blobstore


【解决方案1】:

前几个错误:

  1. 您的 HTML 页面不是 PDF 文档,因此您不能将其 Content-type 声明为 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=&lt;..&gt; 处理程序到 serve images from blobstore

你需要做什么:

  1. 确保按照上面第 3 点中的链接所述正确提供 Blob。

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

【讨论】:

  • 关于第 1 点,我已经尝试了两种方法;使用“应用程序/pdf”和“文本/html”。结果相同。关于第 2 点,如果我将以下代码放入 html 页面并加载该页面,它会很好地显示 pdf:“” 关于第 3 点,我不是从 blobstore 提供服务,我正在从数据存储提供 blob。链接到“来自 blobstore 的服务器图像”我很难理解。感谢您的 cmets 和努力,但我仍在努力让它发挥作用。如何检索和嵌入在数据存储中存储为 blob 的图形并显示它?谢谢。
  • 您只能在代码中使用 Datastore。您无法创建指向您的数据存储内容(您的 pdf blob)的直接链接。您必须创建一个处理程序,从数据库中获取 blob 并为其提供服务(作为内容类型“application/pdf”)。然后您可以在 Htmal 中使用指向此处理程序的链接。
  • 嗨,彼得。那么如何创建一个从数据库中获取 blob 的处理程序呢?我认为这就是 RetrieveResults 类。该查询检索 blob.key。然后我的印象是,在向客户端浏览器返回请求期间,图形本身将替换 blob.key。我只是不知道如何调试它,或将其分解以解决问题。我很迷茫....
猜你喜欢
  • 2013-07-30
  • 2011-10-10
  • 2012-07-18
  • 1970-01-01
  • 2020-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多