2012-08-08 53 views
0

我在StackOverflow上的第一个问题。 。 。如何使用Python从Google App Engine显示pdf blob

在使用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

您没有使用Blob存储区,你只是存储内的一个blob实体。 – 2012-08-08 06:10:55

+0

您应该发布/ retrieve_results处理程序代码。 – 2012-08-08 06:12:05

+0

并欢迎堆栈溢出。 – 2012-08-08 06:12:33

回答

2

首先几个错误:

  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=<..>处理程序serve images from blobstore

你需要做的:

  1. 确保你提供正确的斑点,如在第3点中的链接上面描述。

  2. 参见如何正确嵌入PDF文件到您的HTML页面的所有选项:Recommended way to embed PDF in HTML?(最简单的将是PDFObject

+0

关于第一点,我尝试了两种方法;用“application/pdf”和“text/html”。同样的结果。关于第二点,如果我把下面的代码放在html页面并加载该页面,它显示pdf就好了:\t“”关于第3点,我不是从blobstore提供服务,我服务的是blob来自数据存储。链接到“blobstore的服务器映像”我很努力去理解。感谢您的意见和努力,但我仍然试图让这个工作。如何在数据存储中检索并嵌入以blob存储的图形并显示它?谢谢。 – Mark 2012-08-13 23:35:20

+0

您只能在代码中使用数据存储。您无法创建指向您的数据存储内容(您的pdf blob)的直接链接。您必须创建一个处理程序,从数据库获取数据并提供它(作为内容类型“application/pdf”)。然后你可以在Htmal中使用链接到这个处理程序。 – 2012-08-14 06:16:59

+0

嗨,彼得。那么,我该如何制作一个从数据库中获取blob的处理程序呢?我认为这就是RetrieveResults类的内容。该查询检索blob.key。然后我在给客户端浏览器返回请求期间,图形本身会替代blob.key。我只是不知道如何调试,或者将其分解来解决问题。我很迷失.... – Mark 2012-08-14 23:13:45

相关问题