def put_obj2storage(file_name = '', data = '', expires='365', type=None, encoding= None, domain_name = setting.STORAGE_DOMAIN_NAME): import sae.const access_key = sae.const.ACCESS_KEY secret_key = sae.const.SECRET_KEY appname = sae.const.APP_NAME domain_name = "attachment" bucket = Bucket(domain_name) bucket.put() bucket.post(metadata={'expires': '2d'}) attrs = bucket.stat() bucket.put_object(file_name, data) file_url = bucket.generate_url(file_name) #begin to created im = Image.open("/s/attachment/" + file_name) #im = Image.open(bucket.get_object_contents(file_name)) im.thumbnail((320,200)) #im.save("/s/attachment/" + file_name+"_thumbnail.jpg") imgext = re.search("(\.\w*)$", file_name) if imgext: thumbnail_name = file_name + "_thumbnail"+ imgext.group(1) else: thumbnail_name = file_name + "_thumbnail.jpg" pureext = imgext.group(1)[1:] if pureext == "jpg": pureext = "jpeg" #bucket.put_object(thumbnail_name, im.tostring('jpeg', 'RGB')) bucket.put_object(thumbnail_name, im.tostring("jpeg", 'RGB')) thumbnail_url = bucket.generate_url(thumbnail_name) #s = sae.storage.Client() #ob = sae.storage.Object(data = data, cache_control='access plus %s day' % expires, content_type= type, content_encoding= encoding) return file_url, thumbnail_url
def image_upload(): if request.method == 'POST': image = request.files['fileList'] if image: bucket = Bucket("avatar") numObejcts = int(bucket.stat()["objects"]) imageId = str(numObejcts + 1) + ".jpg" # resize image outbuf = cStringIO.StringIO() size = (800, 900) process = Image.open(image.stream) process.resize(size, Image.BILINEAR) process.save(outbuf, "JPEG") # save image bucket.put_object(imageId, outbuf) # bucket.put_object(imageId, image.stream) url = bucket.generate_url(imageId) return url return jsonify(error="fail to upload image")
class SAEStorage(LocalStorage): def __init__(self, bucket): from sae.storage import Bucket self.bucket = Bucket(bucket) bucket_stat = self.bucket.stat() #self.last_mark = bucket_stat.objects + \ # bucket_stat.bytes self.last_mark = 0 def list(self): articles = self.bucket.list() filter_func = lambda x : self.is_article(x.name) articles = filter(filter_func, articles) articles = self._sorted_files(articles) rst = [] for article in articles: article_name = article.name content = self.bucket.get_object_contents(article_name) content = content.decode('utf-8') art_meta = self._get_metadatas(content) art_meta['filename'] = article_name if type(article.name) == unicode: adjust_name = article_name.encode('utf-8') else : adjust_name = article_name art_meta['filename_url_encode'] = \ base64.urlsafe_b64encode(adjust_name) if not art_meta['date']: art_meta['date'] = article.last_modified if not art_meta["slug"]: art_meta['slug'] = article_name.rpartition(".")[0] art_meta['slug'] = art_meta['slug'].replace("_", " ") rst.append(art_meta) return rst def get(self, article, cut = -1): content = self.bucket.get_object_contents(article) content = content.decode('utf-8') content = unicode(content) mdparse = MDParse() if cut != -1: content = content[:cut] content += "\n....." content = self._clean_metadatas(content) return mdparse.parse(content) def save(self, name, content): self.bucket.put_object(name, content) def delete(self, name): self.bucket.delete_object(name) def update_time(self, article): stat = self.bucket.stat_object(article) tmp = float(stat.timestamp) d = datetime.datetime.fromtimestamp(tmp) return d.strftime("%Y-%m-%d %H:%M:%S") def has_last(self): bucket_stat = self.bucket.stat() curr_mark = bucket_stat.objects + bucket_stat.bytes res = self.last_mark == curr_mark self.last_mark = curr_mark return not res def _sorted_files(self, articles): def key_func(x): stat = self.bucket.stat_object(x.name) return float(stat.timestamp) return sorted(articles, key=key_func, reverse=True)
class SAEStorageKVDB(object): ''' A bridge for pyutils kvdb wrapper to access sae storage like a kvdb. e.g. from pyutils import KVDBWrapper from sae_storage import SAEStorageKVDB kvclient = KVDBWrapper(SAEStorageKVDB, bucket='mybucket', accesskey='xxx', secretkey='yyy', account='myapp', prefix='PRE:', ...) kvclient.set(key,value) kvclient.get(key) ''' def __init__(self, **kwargs): bucket = kwargs['bucket'] if 'bucket' in kwargs else '' accesskey = kwargs['accesskey'] if 'accesskey' in kwargs else '' secretkey = kwargs['secretkey'] if 'secretkey' in kwargs else '' account = kwargs['account'] if 'account' in kwargs else '' # app name retries = long( kwargs['retries']) if 'retries' in kwargs else 3 # app name self.prefix = kwargs['prefix'] if 'prefix' in kwargs else '' if accesskey and secretkey and account: conn = Connection(accesskey, secretkey, account, retries) self.kv = conn.get_bucket(bucket) else: self.kv = Bucket(bucket) def info(self): return self.kv.stat() def get(self, key, **kwargs): k = self.prefix + key return self.kv.get_object(k, **kwargs) def set(self, key, value, **kwargs): k = self.prefix + key return self.kv.put_object(k, value, **kwargs) def delete(self, key, **kwargs): k = self.prefix + key return self.kv.delete_object(k, **kwargs) def exist(self, key, **kwargs): k = self.prefix + key rc = False st = self.kv.stat_object(k) if st: rc = True return rc def scan(self, cursor=None, count=100, **kwargs): ''' Retrieve keys by given arguments :param kwargs: 'count' for retrieve count; 'cursor' is the key for next time retrieve :return: ''' return self.kv.c(prefix=self.prefix, marker=cursor, limit=count, **kwargs) def scanv(self, cursor=None, count=100, **kwargs): ''' Retrieve key-values by given arguments :param kwargs: 'count' for retrieve count; 'cursor' is the key for next time retrieve :return: ''' return self.kv.list(prefix=self.prefix, marker=cursor, limit=count, **kwargs) def mget(self, keys, **kwargs): for key in keys: k = self.prefix + key val = self.get(k, **kwargs) yield val