1

我正在使用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

感谢帮助。

4

2 回答 2

1

问题是这两行:

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

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

buf = cStringIO.StringIO()
out.save(buf, "PNG")
data = buf.getvalue()
于 2012-04-20T00:15:01.030 回答
0

我不确定这个错误是什么意思,但我认为你不能在 Python 中使用 'get' 作为类名。

换个试试怎么样

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):
于 2012-04-19T23:58:45.567 回答