在GAE中的blobstore上存储过滤的图像

时间:2012-04-19 20:37:44

标签: google-app-engine python-2.7 blobstore

我正在使用python2.7在GAE上进行简单的应用程序,此应用程序的目的是过滤用户上传的图像并将此图像存储在GAE的blobstore中,首先我尝试存储原始图像(在blobstore中上传一个然后通过使用url获取它并过滤它并最后将过滤后的图像存储在blobstore上,原始图像存储正确但过滤后的图像不存储。 这是我试过的代码:

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

这是日志文件:

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题在于这两行:

out = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
# ...
data = out

out是一个PIL图像对象(因此,data也是如此),并且您正在尝试将其直接写入文件。首先,您需要以您选择的文件格式(例如,PNG,JPG)序列化图像。例如,将第二行更改为此将起作用:

buf = cStringIO.StringIO()
out.save(buf, "PNG")
data = buf.getvalue()

答案 1 :(得分:0)

我不确定错误的含义,但我不认为你可以使用&#39; get&#39;作为Python中的类名。

如何尝试更改

application = webapp.WSGIApplication( [(r'/get.py', get)], debug=True)

application = webapp.WSGIApplication( [(r'/get.py', GetHandler)], debug=True)

并改变

class get(webapp.RequestHandler):
    def post(self):

class GetHandler(webapp.RequestHandler):
    def post(self):