写了一个将S3上的所有数据导入阿里云开放存储的python代码,给大家抛砖引玉了!
这段代码运行需要boto和OSS的python SDK(资源链接网站不让新手贴,大家网上搜搜吧!)。
大家运行前,填好自己在s3和oss上的ID和KEY就好了。
#-*-coding:utf-8-*-
"""
Author: 22742545@qq.com
Version: 0.1
功能描述:将Amazon S3上的数据导入到阿里云开放存储(OSS)
功能细节:
1. 依赖OSS官方提供的pythonS3的boto库,以及
2. 创建S3上同名的bucket,如果在OSS上遇到重名冲突,会交互式提示改bucket名称
2. Copy Object的时候,会使用S3上相同的content-type
3. 想单独从S3复制一个bucket到OSS上,可以直接使用move_bucket函数
依赖环境:
1. Amazon S3的boto开发包
2. OSS的官方python SDK
TODO:
1. 没有处理网络异常,使用者网速慢时会有异常
2. Object的Header只复制了content-type,其他的Header(包括user-header)并未复制
3. 每次复制只能从头开始,不提供断点续传
4. 所有文件缓存操作都在内存中进行,没考虑超大文件情况
"""
from oss_api import *
from oss_xml_handler import *
import boto
from boto.s3.key import Key
s3_id = "< 填入你S3的ID>"
s3_key = "< 填入你S3的Secret Key>"
oss_id = "< 填入你OSS的ID>"
oss_key = "< 填入你OSS的Secret Key>"
#Create two connections of S3 and OSS
s3_conn = boto.connect_s3(s3_id, s3_key)
oss_conn = OssAPI("storage.aliyun.com", oss_id, oss_key)
"""
从S3上复制一个bucket的所有数据到OSS
"""
def move_bucket(s3_bucket_name, oss_bucket_name):
s3_bucket = s3_conn.get_bucket(s3_bucket_name)
key_list = s3_bucket.get_all_keys()
print " Move the s3 bucket (%s) to oss bucket (%s), there are %s files in this bucket." % (s3_bucket_name, oss_bucket_name, len(key_list))
for key in key_list:
object = s3_bucket.get_key(key.name)
print " Moving object: %s (size: %s, content-type: %s)" % (object.name, object.size, object.content_type)
oss_conn.put_object_with_data(oss_bucket_name, key.name, object.read(object.size), object.content_type)
print " Move bucket %s finish!" % s3_bucket_name
print "========================================================="
def main():
print "Step 1. Get your bucket list from s3."
s3_res = s3_conn.get_all_buckets()
print "Your bucket list:"
for bucket in s3_res:
print " ", bucket.name
print "\nStep 2. Create the oss buckets and move the objects."
print "========================================================="
for bucket in s3_res:
name = bucket.name
while True:
print " Create the oss bucket:", name
oss_res = oss_conn.create_bucket(name)
if 200 != oss_res.status:
val = raw_input(" Create oss bucket failed. Do you want to change the bucket name (Y/N)?")
if val == "y" or val == "Y":
name = raw_input(" Input new oss bucket name:")
else:
break;
else:
break
move_bucket(bucket.name, name)
if __name__ == '__main__':
main()
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。