我正在使用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
感谢帮助。