def post(self): """ Note: BlobstoreUploadHandler POSTs must return a redirect """ logging.info("starting post") upload_files = self.get_uploads() handle = self.request.get("handle") signature = self.request.get("signature") logging.info("Handling post for handle=%s signature=%s" % (handle, signature)) try: if len(upload_files) > 0: blob_info = upload_files[0] data = blobstore.fetch_data(blob_info.key(), 0, blob_info.size) imgtemp = images.Image(image_data=data) width = imgtemp.width height = imgtemp.height logging.info("Got upload %s => handle=%s size=%dx%d" % (blob_info.__dict__, handle, width, height)) if is_alphanumeric(handle) and \ is_alphanumeric(signature) and \ is_signature_valid(handle, signature): image = find_image_by_handle(handle) api_response = "/image/info?handle=%s&signature=%s" % (handle, signature) if image is not None: # TODO: add an option to clobber an existing image response = { 'handle': image.handle, 'created_at': image.created_at.isoformat(), 'status': image.status } logging.info("Image already exists: %s" % response) self.redirect(api_response) return image = ImageAsset(handle=handle, status="done", width=width, height=height, blob_key=blob_info.key()) image.put() if (self.request.get("return")): # this was submitted by the Gallery form self.redirect(self.request.get("return")) else: # this was submitted by an API client logging.info("Created image: %s" % image) # TODO: callback to the BC API to update that the image submission completed self.redirect(api_response) return else: logging.error("Invalid params: handle=%s signature=%s" % (handle, signature)) else: media = self.request.get("media") logging.error("Nothing uploaded? %s" % upload_files) logging.error("media = %s" % media) logging.error("Request data: %s" % self.request.__dict__) #except blobstore.BlobFetchSizeTooLargeError, e: # self.redirect("/image/error?handle=%s&signature=%s&error=%s" % (handle, signature, urllib.quote(str(e))) # return #except DeadlineExceededError, e: # self.redirect("/image/error?handle=%s&signature=%s&error=%s" % (handle, signature, urllib.quote(str(e))) # return except: logging.error("Request data: %s" % self.request.__dict__) logging.error("Image upload failed: ", exc_info=1) # TODO (maybe): redirect to an error handler self.error(500)
def post(self): status = self.request.get("status") handle = self.request.get("handle") signature = self.request.get("signature") check_param(self.response, "handle", handle) check_param(self.response, "signature", signature) check_signature(self.response, handle, signature) if status: image = find_image_by_handle(handle) image.put()
def get(self): handle = self.request.get("handle") signature = self.request.get("signature") check_param(self.response, "handle", handle) check_param(self.response, "signature", signature) check_signature(self.response, handle, signature) image = find_image_by_handle(handle) self.response.headers['Content-Type'] = 'application/json' response = { 'handle': image.handle, 'created_at': image.created_at.isoformat(), 'status': image.status } self.response.out.write(simplejson.dumps(response))
def get(self): handle = self.request.get("handle") signature = self.request.get("signature") check_param(self.response, "handle", handle) check_param(self.response, "signature", signature) check_signature(self.response, handle, signature) image = find_image_by_handle(handle) if image: blobstore.delete(image.blob_key.key()) response = { 'handle': handle, 'created_at': image.created_at.isoformat(), 'status': 'deleted' } image.delete() else: response = { 'handle': handle, 'status': 'not found' } self.response.headers['Content-Type'] = 'application/json' self.response.out.write(simplejson.dumps(response))
def get(self, handle, size): image = find_image_by_handle(handle) inflate = self.request.get("inflate") direct = self.request.get("direct") logging.info("Got image %s for handle %s" % (image, handle)) if image: try: self.response.headers["Cache-Control"] = 'public,max-age=%d' % int(60*24*60*60) self.response.headers["Expires"] = (datetime.datetime.today()+datetime.timedelta(days=60)).strftime('%a, %d %b %Y %H:%M:%S GMT') self.response.headers["X-Image-Dimensions"] = "%sx%s" % (image.width, image.height) if size == 'full': image_url = images.get_serving_url(str(image.blob_key.key())) if direct == '1': return self.direct(image_url) self.redirect(image_url, permanent=True) return else: requested_width, requested_height = parse_dimension_string(size) if requested_width == requested_height: crop = True else: crop = False image_size = image.width if image.width > image.height else image.height requested_size = requested_width if requested_width > requested_height else requested_height if inflate != '1' and requested_size > image_size: serving_size = image_size else: serving_size = requested_size logging.info("Serving %s scaled to %s with crop=%s" % (handle, serving_size, crop)) image_url = images.get_serving_url(str(image.blob_key.key()), size=serving_size, crop=crop) if direct == '1': return self.direct(image_url) self.redirect(image_url, permanent=True) return except images.BadImageError, images.NotImageError: logging.error("Image request failed: ", exc_info=1) self.error(500)