2012-08-08 29 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