アイテムの登録、編集機能を作っていて気づいたのですが
いまのapiだと1つのapiで複数の画像をアップロードすることになるため
送信時間が非常に長く、ユーザー体験が悪くなってしまいます。
このあたり他のアプリはどうやっているのかなとメルカリ(http://mercari.jp )を調べたのですが
メルカリは1画像を選択するごとにサーバにアップロードしているようです。
そんなわけでマネしてみました。
アップローダーの完成です。
メルカリ触ってて思ったのですが、いつかは画像加工機能も入れたいですね!
# 画像のアップロード
class PutImage(UserLoginAuthRequestHandler):
def post(self):
if self.invalidateAccount():
Common.writeUserResponseError(self, 401,u"無効セッション")
return
blob = self.request.get('blob')
content_type = self.request.params['blob'].type
blobHash = hashlib.md5(blob).hexdigest()
gcsPath = Common.createImagePath(blobHash)
Common.saveToGCS(gcsPath,blob,content_type)
entity = ImageFile()
entity.path = gcsPath
entity.md5 = blobHash
entity.put()
res = dict(
url = webapp2.uri_for('GetImage',_full=True,imageid=entity.key.id())
)
Common.writeUserResponseSuccess(self, res )
# 指定した画像を返す
class GetImage(UserLoginAuthRequestHandler):
def get(self):
imageid = int(self.request.get('imageid'))
item = ImageFile.get_by_id(imageid)
path = item.path
gcs_file = gcs.open(path)
gcs_stat = gcs.stat(path)
self.response.content_type = gcs_stat.content_type
self.response.content_type_params = None
self.response.write(gcs_file.read())
gcs_file.close()
app = webapp2.WSGIApplication(
[
webapp2.Route('/user/api/resource/putimage', PutImage,'PutImage'),
webapp2.Route('/user/api/resource/getimage', GetImage,'GetImage'),
],
debug=Common.isDebug()
)
こんな感じでサークルアイテムの登録・編集機能がつきました。
https://github.com/nagai/freemarket/tree/20140429
次回は即売会会場を作ります。