2013-08-23 59 views
6

Tôi muốn người dùng có thể tải hình ảnh lên Google App Engine. Tôi có sau (Python):Google App Engine (Python) - Tải lên tệp (hình ảnh)

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

Thông tin được gửi bởi người dùng sử dụng một hình thức (HTML):

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

Đó là sau đó được xử lý bởi:

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() 

Tuy nhiên, khi tôi cố tải lên hình ảnh, hãy nói "Book.png", tôi gặp lỗi: BadValueError: Expected str, got u'Book.png'

Bất kỳ ý tưởng gì đang xảy ra? Tôi đã làm việc với GAE trong một thời gian, nhưng đây là lần đầu tiên tôi phải sử dụng các đốm màu.

Tôi đã sử dụng liên kết này: https://developers.google.com/appengine/docs/python/images/usingimages sử dụng db chứ không phải ndb. Tôi cũng đã cố gắng lưu trữ các hình ảnh trong một biến đầu tiên như trong liên kết: storedInfo = self.request.get('image') và sau đó lưu trữ nó: imagedata.image = ndb.Blob(storedInfo) mà cũng mang lại cho tôi một lỗi: AttributeError: 'module' object has no attribute 'Blob' Cảm ơn trước.

+2

Các lỗi được thông báo rằng bạn' đang cố gắng thiết lập một đối tượng Unicode là giá trị của một blob, mà trong trường hợp này có vẻ là tên tập tin, chứ không phải là dữ liệu tập tin. o lấy dữ liệu thô dưới dạng đường trong webapp2, vì vậy chỉ cần đăng bài dưới dạng nhận xét) – geoffspear

+1

lý do nào bạn không sử dụng api blobstore hơn kho dữ liệu? https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob – Faisal

+1

Cảm ơn bạn Wooble, nhưng bạn đề nghị tôi nên làm gì? Và Faisal, tôi không sử dụng nó bởi vì nó cần db (Tôi đang sử dụng ndb) và webapp (Tôi đang sử dụng webapp2). – Albraa

Trả lời

2

Bạn phải thêm enctype="multipart/form-data" mẫu của bạn để cho tiện làm việc

<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

Có một ví dụ tuyệt vời trong tài liệu mô tả làm thế nào để tải lên tập tin vào Blobstore sử dụng một hình thức HTML: https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

Biểu mẫu phải trỏ đến url được tạo bởi blobstore.create_upload_url('/foo') và phải có một lớp con của BlobstoreUploadHandler tại /foo như sau:

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() 

Để làm việc này, bạn nên thay đổi mô hình dữ liệu của mình sao cho trong ImageData, image tham chiếu đến ndb.BlobKeyProperty().

Bạn có thể phục vụ hình ảnh của mình chỉ từ url được tạo bởi images.get_serving_url(imagedata.image), được tùy chỉnh kích thước và cắt.

7

Đã có cùng một câu hỏi.

chỉ cần thay thế

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

với:

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

cũng hình thức của bạn cần có enctype = "multipart/form-data

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data"> 
Các vấn đề liên quan