2014-03-04 187 views
0

我正在使用Python在Google App Engine上創建電子商務平臺。爲此,我需要將我將提供的產品的細節存儲在一個單獨的實體中,該實體還將包含每個單獨產品的圖像。現在,我如何將圖像存儲在數據存儲中?另外,更重要的是,如何從數據庫中提取圖像並在應用程序中將其顯示給用戶?Google App Engine:將圖像存儲在數據庫(Python)中

編輯:

上傳我的形象到「圖片」實體後,我試圖顯示它。下面是相同的代碼:

main.py

class FileUpload(Handler): 
    def post(self): 
     file_upload = self.request.POST.get("file", None) 
     file_name = file_upload.filename 
     image = Images(id=file_name, file_name=file_name, blob=file_upload.file.read()) 
     image.put() 

     self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0] 
     self.response.write(image.blob) 
     self.final() 

    def final(self): 
     images = db.GqlQuery("Select * FROM Images WHERE file_name = 'CN.jpg'") 
     self.render("template.html", images = images) 

class Blob(Handler): 
    def get(self): 
     self.render("blob.html") 


app = webapp2.WSGIApplication([('/', MainPage), 
           ('/signup', Register), 
           ('/login', Login), 
           ('/logout', Logout), 
           ('/mp', MP), 
           (r'/file_upload', FileUpload), 
           ('/blob', Blob)], debug=True) 

template.html

<html> 
<head> 
    <title>Template</title> 
</head> 
<body> 
    {% 
     for image in images 
    %} 
    <div>{{image.blob}}</div> 
    {%endfor%} 
</body> 
</html> 

blob.html

<!DOCTYPE HTML> 
<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Image Upload</title> 
</head> 
<body> 
<form action="/file_upload" enctype="multipart/form-data" method="post"> 
    <div><input type="file" name="file"/></div> 
    <div><input type="submit" value="Upload"></div> 
</form> 
</body> 
</html> 

現在,在template.html,我是期待我正試圖提取的圖像被顯示。但是,我收到以下錯誤:

<div>{{image.blob}}</div> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 
+1

看看blobstore。另請參閱圖像文檔。有可能是有幫助的:https://developers.google.com/appengine/docs/python/images/usingimages – mgilson

回答

5

上傳圖像,將其保存到數據存儲並提供圖像的基本示例。

fileupload。潘岳:

import webapp2 
from google.appengine.ext import ndb 
import mimetypes 


class Images(ndb.Model): 
    file_name = ndb.StringProperty() 
    blob = ndb.BlobProperty() 


class FileUpload(webapp2.RequestHandler): 

    def post(self): 

     file_upload = self.request.POST.get("file", None) 
     file_name = file_upload.filename 
     image = Images(id=file_name, file_name=file_name, blob=file_upload.file.read()) 
     image.put() 

     self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0] 
     self.response.write(image.blob) 


class ImgServe(webapp2.Requesthandler): 

    def get(self, resource): 

     image = ndb.Key('Images', resource).get() 
     self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0] 
     self.response.write(image.blob)    

這裏是靜態的形式發佈圖片:

<!DOCTYPE HTML> 
<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Image Upload</title> 
</head> 
<body> 
<form action="/file_upload" enctype="multipart/form-data" method="post"> 
    <div><input type="file" name="file"/></div> 
    <div><input type="submit" value="Upload"></div> 
</form> 
</body> 
</html> 

路由表單提交:

webapp2.Route(r'/file_upload', handler='fileupload.FileUpload') 

路由的鏡像服務器:<img alt="test" src="/img_serve/test.png" />

webapp2.Route(r'/img_serve/<resource:(.*)>', handler='fileupload.ImgServe')) 
+0

這真的很有幫助,謝謝。 –

+0

我編輯了我原來的帖子。無法顯示存儲在數據存儲的「圖像」實體中的圖像。 –

+1

您無法以這種方式顯示圖像。您必須使用HTML 標記,該標記鏈接到處理程序(ImgServe)並顯示圖像,如我在示例中所示。例如:test voscausa

2

您可以使用Google高性能圖像服務。您必須將圖像存儲或上傳到Blobstore或Google雲端存儲並創建一個serving_url。

好處:

  • 高性能
  • 谷歌將成爲圖像。你不需要處理程序;
  • 便宜
  • 動態調整大小和裁剪。

更多:https://developers.google.com/appengine/docs/python/blobstore/ get_serving_url:在服務斑點https://developers.google.com/appengine/docs/python/images/functions

+0

無法將我的本地機器中的圖像添加到數據存儲中? –

+0

是的,你可以。您可以將圖像置於blob屬性中,但圖像的大小受到實體大小的限制。如果將圖像放入數據存儲中,則必須自己提供圖像。 – voscausa

+0

請看下面的例子。 – voscausa

0

有幾個選項,您可以根據圖像的大小和工作流程之間的決定。

  1. 如果圖像是固定的並且只能由開發團隊更改,則可以將它們包括爲靜態文件。
  2. 您可以使用the blobstore api啓用上傳和查看圖像。
  3. 您也可以使用Google Cloud Storage libraries進行上傳/查看。我覺得Google正在朝着這個方向而不是blobstore走。
+0

無法將我的本地機器中的圖像添加到數據存儲中? –

相關問題