2013-08-23 160 views
6

我希望用戶能夠將圖像上傳到Google App Engine。我有以下(Python)的:Google App Engine(Python) - 上傳文件(圖片)

class ImageData(ndb.Model): 
    name = ndb.StringProperty(indexed=False) 
    image = ndb.BlobProperty() 

信息是通過使用表格的用戶提交的(HTML):

<form name = "input" action = "/register" method = "post"> 
    name: <input type = "text" name = "name"> 
    image: <input type = "file" name = "image"> 
</form> 

,然後由處理:

class AddProduct(webapp2.RequestHandler): 
    def post(self): 
     imagedata = ImageData(parent=image_key(image_name)) 
     imagedata.name = self.request.get('name') 
     imagedata.image = self.request.get('image') 
     imagedata.put() 

然而,當我嘗試上傳的圖像,讓我們說「Book.png」,我得到的錯誤: BadValueError: Expected str, got u'Book.png'

有什麼想法發生了什麼?我一直在與GAE合作一段時間,但這是我第一次使用blob。

我用這個鏈接:https://developers.google.com/appengine/docs/python/images/usingimages 它使用db,而不是ndb。 我也試過在一個變量存儲圖像的第一像鏈接: storedInfo = self.request.get('image') ,然後將其存儲: imagedata.image = ndb.Blob(storedInfo) 這也給了我一個錯誤: AttributeError: 'module' object has no attribute 'Blob' 在此先感謝。

+2

錯誤是告訴你,你」重新嘗試設置一個Unicode對象作爲blob的值,在這種情況下,它似乎是文件名,而不是文件數據本身(我不確定如何o獲取原始數據作爲webapp2中的一個str,因此僅作爲註釋發佈) – geoffspear

+1

您沒有使用blobstore api而不是數據存儲的任何原因? https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob – Faisal

+1

謝謝Wooble,但你會建議我做什麼? 費薩爾,我沒有使用它,因爲它需要db(我使用ndb)和webapp(我正在使用webapp2)。 – Albraa

回答

2

您必須添加enctype="multipart/form-data"到表單這個工作

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data"> 
    name: <input type = "text" name = "name"> 
    image: <input type = "file" name = "image"> 
</form> 
4

有介紹如何使用HTML表單來上傳文件到Blob存儲文檔中一個很好的例子:https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

形式應指向由blobstore.create_upload_url('/foo')產生的URL和應在/foo這樣是BlobstoreUploadHandler的子類:

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): 
    def post(self): 
    upload_files = self.get_uploads('file') 
    blob_info = upload_files[0] 
    imagedata = ImageData(parent=image_key(image_name)) 
    imagedata.name = self.request.get('name') 
    imagedata.image = blob_info.key() 
    imagedata.put() 

對於這個工作,你應該改變你的數據模型,使得在ImageDataimage referes到ndb.BlobKeyProperty()

您可以從images.get_serving_url(imagedata.image)生成的網址直接提供您的圖片,可選擇調整大小和裁剪。

7

有相同的概率。

只需更換

imagedata.image = self.request.get('image') 

有:

imagedata.image = str(self.request.get('image')) 

也表單需要有ENCTYPE =「的multipart/form-data的

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data"> 
相關問題