I’m working on simple application on GAE using python2.7,the purpose for this application is to filter image that are uploaded by the users and store this image in blobstore in GAE,firstly i tried to store the original image(uploaded one)in blobstore then get it by using the url and filter it and lastly store the filtered image on blobstore,the original image is stored correctly but the filtered one isn’t.
This is the code that i tried:
from __future__ import with_statement
from google.appengine.api import files
from PIL import Image
from PIL import ImageFilter
import cgi, cgitb ; cgitb.enable()
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp.util import run_wsgi_app
import mimetypes
from google.appengine.ext import blobstore
from mimetypes import guess_type
from google.appengine.api import images
def mime_type(filename):
return guess_type(filename)[0]
class get(webapp.RequestHandler):
def post(self):
form = cgi.FieldStorage()
file_upload = form['file']
name=file_upload.filename
m=mimetypes.guess_type(name)[0]
u_file = files.blobstore.create(mime_type=m,_blobinfo_uploaded_filename=name)
data=file_upload.file.read()
with files.open(u_file, 'a') as f:
f.write(data)
files.finalize(u_file)
blob_key = files.blobstore.get_blob_key(u_file)
url = images.get_serving_url(blob_key)
imageFile = str(url)
img = images.Image(blob_key=blob_key)
blob_info = blobstore.BlobInfo.get(blob_key)
im = Image.open(blob_info.open())
out = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
u_file = files.blobstore.create(mime_type=m,_blobinfo_uploaded_filename=name)
data=out
with files.open(u_file, 'a') as f:
f.write(data)
files.finalize(u_file)
blob_key = files.blobstore.get_blob_key(u_file)
url = images.get_serving_url(blob_key)
self.response.out.write("""<html><br><body style="background-color:#CC9999"><b><font size="5" face="Batang" ><center> <li ><img src="%s"</a>
</center></font><hr></body></html>
""" % (str(url)))
def main():
#application = webapp.WSGIApplication( [('/serve/([^/]+)?', ServeHandler),], debug=True)
application = webapp.WSGIApplication( [(r'/get.py', get)], debug=True)
run_wsgi_app(application)
if __name__ == "__main__":
main()
This is the log file:
2012-04-19 13:36:25.073
Traceback (most recent call last):
File "/base/data/home/apps/s~filterimages2012/1.358325815417263944/get.py", line 59, in <module>
main()
File "/base/data/home/apps/s~filterimages2012/1.358325815417263944/get.py", line 55, in main
run_wsgi_app(application)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/webapp/util.py", line 98, in run_wsgi_app
run_bare_wsgi_app(add_wsgi_middleware(application))
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/webapp/util.py", line 116, in run_bare_wsgi_app
result = application(env, _start_response)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1519, in __call__
response = self._internal_error(e)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1511, in __call__
rv = self.handle_exception(request, response, e)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1077, in __call__
return handler.dispatch()
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 547, in dispatch
return self.handle_exception(e, self.app.debug)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/base/data/home/apps/s~filterimages2012/1.358325815417263944/get.py", line 43, in post
f.write(data)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/api/files/file.py", line 316, in write
request.set_data(data)
File "cpp_message.pyx", line 124, in cpp_message.SetScalarAccessors.Setter (third_party/apphosting/python/protobuf/proto1/cpp_message.cc:2229)
TypeError: <type 'instance'> has type <type 'instance'>, but expected one of: str, unicode
Thanks for help.
The problem is these two lines:
outis a PIL Image object (and thus,datais too), and you’re trying to write that directly to a file. First, you need to serialize the image in a file format of your choice (eg, PNG, JPG). For instance, changing the second line to this will work: