使用BlobstoreUploadHandler处理图像上传并返回JSON消息
我正在尝试将一张图片上传到一个通过create_upload_url()创建的链接上,然后用默认的BlobstoreUploadHandler来处理这个上传,并返回一个JSON消息给客户端,这个消息里包含了通过get_serving_url()获取的图片链接。我的代码如下:
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
response = {}
upload_files = self.get_uploads('file')
blob_info = upload_files[0]
response['error'] = False
response['message'] = "Image uploaded."
response['image_url'] = images.get_serving_url(blob_info.key())
self.response.headers['Content-Type'] = 'application/json'
self.response.out.write(json.dumps(response))
app = webapp2.WSGIApplication(
[('/_ih/upload_handler/', UploadHandler),
], debug=True)
问题是客户端没有收到任何响应。AppEngine的日志显示请求的状态是200,这意味着请求成功。当我用flash发起请求时,状态码也是200,但没有响应内容;而使用HTML5时,状态显示为“(已取消)”。我完全不知道发生了什么。从我在网上看到的所有代码片段来看,这个应该是可以工作的。请帮帮我!谢谢。
2 个回答
2
为了处理文件上传并返回JSON格式的响应,你需要从上传处理程序跳转到一个能够返回JSON响应的处理程序。
下面是一个例子:
class FileUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
blob_info = self.get_uploads()[0]
self.redirect(self.uri_for("successfulUpload",blob_key = blob_info.key()))
class SuccessfulUpload(BaseHandler):
def get(self, blob_Key):
response['error'] = False
response['message'] = "Image uploaded."
response['image_url'] = images.get_serving_url(blobstore.BlobKey(blob_Key))
self.response.headers['Content-Type'] = 'application/json'
self.response.out.write(json.dumps(response))
2
原来这是一个HTML5的跨域资源共享问题。你可以通过在响应中添加正确的头信息来解决这个问题:
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
response = {}
upload_files = self.get_uploads('file')
blob_info = upload_files[0]
response['error'] = False
response['message'] = "Image uploaded."
response['image_url'] = images.get_serving_url(blob_info.key())
self.response.headers.add_header("Access-Control-Allow-Methods", "POST")
self.response.headers.add_header("Access-Control-Allow-Origin", "*")
self.response.headers['Content-Type'] = 'application/json'
self.response.out.write(json.dumps(response))