Skip to content
This repository was archived by the owner on Feb 18, 2019. It is now read-only.

modify connnection.py, s3/connection.py, s3/bucket.py, s3/key.py to s… #2

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,43 @@ This is MSS SDK for python。
mp.upload_part_from_file(fp, part_num=i + 1)

mp.complete_upload()

# handle image
图片服务通过get_image_key()获取一个image key
image key对象可以用来下载处理后的图片和生成presideUrl
image_port和image_host对应图片服务器的port和host

import mssapi
from mssapi.s3.connection import S3Connection

image_port = 80
image_host = 'image.mtmss.com'

conn = S3Connection(
aws_access_key_id = access_key,
aws_secret_access_key = access_secret,
port = port,
host = host,
image_port = image_port,
image_host = image_host,
)

创建桶并上传图片

b = conn.create_bucket('image-bucket')
k = b.new_key('example.jpg')
k.set_contents_from_filename('example.jpg')

对图片旋转30度

process = '30r'
k1 = b.get_image_key('example.jpg', process)
k1.get_contents_to_filename("example_rotation.jpg")
print k1.generate_url(3600)

给图片打水印

process = "watermark=2&text=aGVsbG8sIHdvcmxk"
k2 = b.get_image_key('example.jpg', process)
k2.get_contents_to_filename("example_water.jpg")
print k2.generate_url(3600)
11 changes: 6 additions & 5 deletions build/lib/mssapi/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -539,7 +539,6 @@ def __init__(self, host, aws_access_key_id=None,
if (sys.version_info[0], sys.version_info[1]) >= (2, 6):
# If timeout isn't defined in mssapi config file, use 70 second
# default as recommended by
# http://docs.aws.amazon.com/amazonswf/latest/apireference/API_PollForActivityTask.html
self.http_connection_kwargs['timeout'] = config.getint(
'Mssapi', 'http_socket_timeout', 70)

Expand Down Expand Up @@ -641,11 +640,13 @@ def get_path(self, path='/'):
path = path + params
return path

def server_name(self, port=None):
def server_name(self, port=None, host=None):
if not port:
port = self.port
if not host:
host = self.host
if port == 80:
signature_host = self.host
signature_host = host
else:
# This unfortunate little hack can be attributed to
# a difference in the 2.6 version of http_client. In old
Expand All @@ -656,9 +657,9 @@ def server_name(self, port=None):
# it no longer does that. Hence, this kludge.
if ((ON_APP_ENGINE and sys.version[:3] == '2.5') or
sys.version[:3] in ('2.6', '2.7')) and port == 443:
signature_host = self.host
signature_host = host
else:
signature_host = '%s:%d' % (self.host, port)
signature_host = '%s:%d' % (host, port)
return signature_host

def handle_proxy(self, proxy, proxy_port, proxy_user, proxy_pass):
Expand Down
14 changes: 11 additions & 3 deletions build/lib/mssapi/s3/bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ def lookup(self, key_name, headers=None):
"""
return self.get_key(key_name, headers=headers)

def get_image_key(self, key_name, action=None):
# This leans on the default behavior of ``new_key`` (not hitting
# the service). If that changes, that behavior should migrate here.
return self.new_key(key_name, action, is_image=True)



def get_key(self, key_name, headers=None, validate=True):
"""
Check to see if a particular key exists within the bucket. This
Expand Down Expand Up @@ -372,7 +379,7 @@ def get_all_keys(self, headers=None, **params):
('CommonPrefixes', Prefix)],
'', headers, **params)

def new_key(self, key_name=None):
def new_key(self, key_name=None, action=None, is_image=False):
"""
Creates a new key

Expand All @@ -384,7 +391,7 @@ def new_key(self, key_name=None):
"""
if not key_name:
raise ValueError('Empty key names are not allowed')
return self.key_class(self, key_name)
return self.key_class(self, key_name, action, is_image)

def generate_url(self, expires_in, method='GET', headers=None,
force_http=False, expires_in_absolute=False):
Expand Down Expand Up @@ -763,7 +770,7 @@ def delete(self, headers=None):
#==================================================================================


'''

def cancel_multipart_upload(self, key_name, upload_id, headers=None):
"""
To verify that all parts have been removed, so you don't get charged
Expand All @@ -780,6 +787,7 @@ def cancel_multipart_upload(self, key_name, upload_id, headers=None):
raise self.connection.provider.storage_response_error(
response.status, response.reason, body)

'''
def get_all_multipart_uploads(self, headers=None, **params):
"""
A lower-level, version-aware method for listing active
Expand Down
33 changes: 26 additions & 7 deletions build/lib/mssapi/s3/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ class S3Connection(AWSAuthConnection):

def __init__(self, aws_access_key_id=None, aws_secret_access_key=None,
is_secure=False, port=None, host=NoHostProvided,
image_host=None, image_port=None,
calling_format=DefaultCallingFormat, path='/',
suppress_consec_slashes=True):

Expand All @@ -186,14 +187,22 @@ def __init__(self, aws_access_key_id=None, aws_secret_access_key=None,

no_host_provided = False
if host is NoHostProvided:
no_host_provided = True
host = self.DefaultHost
if image_host is not None:
host = image_host
else:
no_host_provided = True
host = self.DefaultHost

if isinstance(calling_format, six.string_types):
calling_format=mssapi.utils.find_class(calling_format)()
self.calling_format = calling_format
self.bucket_class = bucket_class
self.anon = anon
self.image_host = image_host
if image_port is not None:
self.image_port = image_port
else:
self.image_port = port

super(S3Connection, self).__init__(host,
aws_access_key_id, aws_secret_access_key,
Expand Down Expand Up @@ -225,7 +234,7 @@ def __contains__(self, bucket_name):
return not (self.lookup(bucket_name) is None)

def generate_url(self, expires_in, method, bucket='', key='', headers=None,
query_auth=True, force_http=False, expires_in_absolute=False):
query_auth=True, force_http=False, expires_in_absolute=False, is_image=False):

version_id=None
response_headers=None
Expand Down Expand Up @@ -281,9 +290,16 @@ def generate_url(self, expires_in, method, bucket='', key='', headers=None,
port = 80
else:
protocol = self.protocol
port = self.port
if is_image:
port = self.image_port
else:
port = self.port
if is_image:
host = self.image_host
else:
host = self.host
return self.calling_format.build_url_base(self, protocol,
self.server_name(port),
self.server_name(port, host),
bucket, key) + query_part

def get_all_buckets(self, headers=None):
Expand Down Expand Up @@ -483,7 +499,7 @@ def delete_bucket(self, bucket, headers=None):

def make_request(self, method, bucket='', key='', headers=None, data='',
query_args=None, sender=None, override_num_retries=None,
retry_handler=None):
retry_handler=None, is_image=False):
if isinstance(bucket, self.bucket_class):
bucket = bucket.name
if isinstance(key, Key):
Expand All @@ -492,7 +508,10 @@ def make_request(self, method, bucket='', key='', headers=None, data='',
mssapi.log.debug('path=%s' % path)
auth_path = self.calling_format.build_auth_path(bucket, key)
mssapi.log.debug('auth_path=%s' % auth_path)
host = self.calling_format.build_host(self.server_name(), bucket)
if is_image:
host = self.calling_format.build_host(self.server_name(port=self.image_port, host=self.image_host), bucket)
else:
host = self.calling_format.build_host(self.server_name(), bucket)
if query_args:
path += '?' + query_args
mssapi.log.debug('path=%s' % path)
Expand Down
12 changes: 9 additions & 3 deletions build/lib/mssapi/s3/key.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,9 @@ class Key(object):



def __init__(self, bucket=None, name=None):
def __init__(self, bucket=None, name=None, action=None, is_image=False):
if action is not None:
name = str(name) + "@" + str(action)
self.bucket = bucket
self.name = name
self.metadata = {}
Expand Down Expand Up @@ -129,6 +131,7 @@ def __init__(self, bucket=None, name=None):
self.ongoing_restore = None
self.expiry_date = None
self.local_hashes = {}
self.is_image = is_image

def __repr__(self):
if self.bucket:
Expand Down Expand Up @@ -240,10 +243,11 @@ def open_read(self, headers=None, query_args='', override_num_retries=None):
self.mode = 'r'

provider = self.bucket.connection.provider
# add for test
self.resp = self.bucket.connection.make_request(
'GET', self.bucket.name, self.name, headers,
query_args=query_args,
override_num_retries=override_num_retries)
override_num_retries=override_num_retries, is_image=self.is_image)
if self.resp.status < 199 or self.resp.status > 299:
body = self.resp.read()
raise provider.storage_response_error(self.resp.status,
Expand Down Expand Up @@ -555,7 +559,7 @@ class of the new Key to be REDUCED_REDUNDANCY. The Reduced
self.bucket.name, self.name,
headers, query_auth,
force_http,
expires_in_absolute,)
expires_in_absolute, self.is_image)

def send_file(self, fp, headers=None, query_args=None, size=None):
"""
Expand Down Expand Up @@ -595,6 +599,8 @@ def send_file(self, fp, headers=None, query_args=None, size=None):
the default behaviour is to read all bytes from the file
pointer. Less bytes may be available.
"""
if self.is_image:
raise MssapiClientError('Image Key Not Support Put Object')

cb=None
num_cb=10
Expand Down
10 changes: 6 additions & 4 deletions mssapi/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -640,11 +640,13 @@ def get_path(self, path='/'):
path = path + params
return path

def server_name(self, port=None):
def server_name(self, port=None, host=None):
if not port:
port = self.port
if not host:
host = self.host
if port == 80:
signature_host = self.host
signature_host = host
else:
# This unfortunate little hack can be attributed to
# a difference in the 2.6 version of http_client. In old
Expand All @@ -655,9 +657,9 @@ def server_name(self, port=None):
# it no longer does that. Hence, this kludge.
if ((ON_APP_ENGINE and sys.version[:3] == '2.5') or
sys.version[:3] in ('2.6', '2.7')) and port == 443:
signature_host = self.host
signature_host = host
else:
signature_host = '%s:%d' % (self.host, port)
signature_host = '%s:%d' % (host, port)
return signature_host

def handle_proxy(self, proxy, proxy_port, proxy_user, proxy_pass):
Expand Down
11 changes: 9 additions & 2 deletions mssapi/s3/bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ def lookup(self, key_name, headers=None):
"""
return self.get_key(key_name, headers=headers)

def get_image_key(self, key_name, action=None):
# This leans on the default behavior of ``new_key`` (not hitting
# the service). If that changes, that behavior should migrate here.
return self.new_key(key_name, action, is_image=True)



def get_key(self, key_name, headers=None, validate=True):
"""
Check to see if a particular key exists within the bucket. This
Expand Down Expand Up @@ -372,7 +379,7 @@ def get_all_keys(self, headers=None, **params):
('CommonPrefixes', Prefix)],
'', headers, **params)

def new_key(self, key_name=None):
def new_key(self, key_name=None, action=None, is_image=False):
"""
Creates a new key

Expand All @@ -384,7 +391,7 @@ def new_key(self, key_name=None):
"""
if not key_name:
raise ValueError('Empty key names are not allowed')
return self.key_class(self, key_name)
return self.key_class(self, key_name, action, is_image)

def generate_url(self, expires_in, method='GET', headers=None,
force_http=False, expires_in_absolute=False):
Expand Down
Loading