コード例 #1
0
ファイル: main.py プロジェクト: co1in9/cts_pkg
def update_packages(url_list):
    cos_client = CosClient(app_id, secret_id, secret_key, region)
    for package in url_list:
        print package.filename
        if package.status == 'need update':
            print 'update'
        elif package.status == 'not exist':
            print 'downloading', package.filename
            urllib.urlretrieve(package.url,
                               os.path.join('packages', 'CTS',
                                            package.filename),
                               reporthook=report)
            sys.stdout.flush()
        else:
            print 'skip', package.filename

        request = StatFileRequest(bucket, unicode('/cts/' + package.filename))
        stat_file_ret = cos_client.stat_file(request)
        if stat_file_ret['code'] != 0:
            file_path = os.path.join(os.path.dirname(__file__), 'packages',
                                     'CTS', package.filename)
            request = UploadFileRequest(bucket,
                                        unicode('/cts/' + package.filename),
                                        unicode(file_path))
            upload_file_ret = cos_client.upload_file(request)
            print upload_file_ret
コード例 #2
0
def download_cos(file):
    appid = 100000  # 根据自己的情况填写
    secret_id = u'# 根据自己的情况填写'
    secret_key = u'# 根据自己的情况填写'
    region = '# 根据自己的情况填写'
    bucket = u'# 根据自己的情况填写'

    cos_client = CosClient(appid, secret_id, secret_key, region)
    request = StatFileRequest(bucket, u'/' + file)
    stat = cos_client.stat_file(request)
    if stat['code'] != 0:
        return 0
    download_url = stat['data']['source_url']  # 使用外网直接访问 URL

    start = time.time()
    r = requests.get(download_url, timeout=60)
    end = time.time()
    if r.status_code != 200:
        return 0
    elapsed = (end - start) * 1000.0

    print 'COS Download File Time %0.3f ms' % elapsed
    return elapsed
コード例 #3
0
ファイル: cosv4.py プロジェクト: SeanPC/cos_migrate_tool
class CosV4StorageService(storage_service.StorageService):
    def __init__(self, *args, **kwargs):

        appid = int(kwargs['appid'])
        region = kwargs['region']
        accesskeyid = unicode(kwargs['accesskeyid'])
        accesskeysecret = unicode(kwargs['accesskeysecret'])
        bucket = unicode(kwargs['bucket'])
        if 'prefix_dir' in kwargs:
            self._prefix_dir = kwargs['prefix_dir']
        else:
            self._prefix_dir = None

        self._cos_api = CosClient(appid,
                                  accesskeyid,
                                  accesskeysecret,
                                  region=region)
        self._bucket = bucket
        self._overwrite = kwargs[
            'overwrite'] == 'true' if 'overwrite' in kwargs else False
        self._max_retry = 20

    def download(self, task, local_path):
        # self._oss_api.get_object_to_file(urllib.unquote(cos_path).encode('utf-8'), local_path)
        for i in range(20):
            logger.info("download file with rety {0}".format(i))
            import os
            try:
                os.remove(task.key)
            except:
                pass
            req = DownloadFileRequest(self._bucket, task.key, local_path)
            ret = self._cos_api.download_file(req)
            # self._oss_api.get_object_to_file(task.key, local_path)
            logger.debug(str(ret))

            if task.size is None:
                logger.info(
                    "task's size is None, skip check file size on local")
                break

            from os import path
            if path.getsize(local_path) != int(task.size):
                logger.error(
                    "Download Failed, size1: {size1}, size2: {size2}".format(
                        size1=path.getsize(local_path), size2=task.size))
            else:
                logger.info("Download Successfully, break")
                break
        else:
            raise IOError("Download Failed with 20 retry")

    def upload(self, task, local_path):
        cos_path = task.key
        if not cos_path.startswith('/'):
            cos_path = '/' + cos_path

        if self._prefix_dir:
            cos_path = self._prefix_dir + cos_path

        if isinstance(local_path, unicode):
            local_path.encode('utf-8')
        insert_only = 0 if self._overwrite else 1
        for i in range(10):
            try:
                upload_request = UploadFileRequest(self._bucket,
                                                   unicode(cos_path),
                                                   local_path,
                                                   insert_only=insert_only)
                upload_file_ret = self._cos_api.upload_file(upload_request)

                if upload_file_ret[u'code'] != 0:
                    logger.warn("upload failed:" + str(upload_file_ret))
                    raise OSError("UploadError: " + str(upload_file_ret))
                else:
                    break
            except:
                pass
        else:
            raise IOError("upload failed")

    def list(self):
        if self._prefix_dir is None:
            for i in self.dfs('/'):
                yield i
        else:
            for i in self.dfs(self._prefix_dir):
                yield i

    def dfs(self, path):
        print "DFS: {path}".format(path=to_utf8(path))
        _finish = False
        _context = u''
        max_retry = self._max_retry

        path = to_unicode(path)

        while not _finish:
            request = ListFolderRequest(bucket_name=self._bucket,
                                        cos_path=path,
                                        context=_context)
            ret = self._cos_api.list_folder(request)

            if ret['code'] != 0:
                max_retry -= 1
            else:
                _finish = ret['data']['listover']
                _context = ret['data']['context']
                for item in ret['data']['infos']:
                    if 'filelen' in item:
                        try:
                            key = "{prefix}{filename}".format(
                                prefix=path, filename=item['name'])
                            yield Task(key, item['filelen'], None)
                        except:
                            pass
                    else:
                        _sub_dir = "{prefix}{filename}".format(
                            prefix=path.encode('utf-8'),
                            filename=item['name'].encode('utf-8'))
                        for i in self.dfs(_sub_dir):
                            yield i

            if max_retry == 0:
                _finish = True

    def exists(self, task):
        _path = task.key
        _size = task.size

        if not _path.startswith('/'):
            _path = '/' + _path
        logger = getLogger(__name__)
        # logger.info("func: exists: " + str(_path))
        if self._prefix_dir:
            _path = self._prefix_dir + _path

        if isinstance(_path, str):
            _path = _path.decode('utf-8')
        request = StatFileRequest(self._bucket, _path)
        ret = self._cos_api.stat_file(request)
        logger.debug("ret: " + str(ret))
        # import json
        # v = json.loads(ret)
        if ret['code'] != 0:
            # logger.warn("error code: " + str(ret['code']))
            return False
        if ret['data']['filelen'] != ret['data']['filesize']:
            logger.warn(
                "file is broken, filelen: {len}, filesize: {size}".format(
                    len=ret['data']['filelen'], size=ret['data']['filesize']))
            return False
        elif _size is not None and ret['data']['filelen'] != _size:
            return False
        elif ret['data']['filelen'] != _size:
            return False
        return True
コード例 #4
0
def cos_demo():
    # 设置用户属性, 包括appid, secret_id和secret_key
    # 这些属性可以在cos控制台获取(https://console.qcloud.com/cos)
    appid = 111  # 替换为用户的appid
    secret_id = u''  # 替换为用户的secret_id
    secret_key = u''  # 替换为用户的secret_key
    region = "shanghai"  #           # 替换为用户的region,目前可以为 shanghai/guangzhou
    cos_client = CosClient(appid, secret_id, secret_key, region)

    # 设置要操作的bucket
    bucket = u''

    ############################################################################
    # 文件操作                                                                 #
    ############################################################################
    # 1. 上传文件(默认不覆盖)
    #    将本地的local_file_1.txt上传到bucket的根分区下,并命名为sample_file.txt
    #    默认不覆盖, 如果cos上文件存在,则会返回错误

    request = UploadFileRequest(bucket, u'/sample_file.txt',
                                u'local_file_1.txt')
    upload_file_ret = cos_client.upload_file(request)

    logger.info("upload file, return message: " + str(upload_file_ret))

    #  分片上传大文件

    request = UploadSliceFileRequest(bucket, u'/sample_bigfile.txt',
                                     u'local_bigfile.txt')
    ret = cos_client.upload_slice_file(request)
    logger.info("slice upload, return message: " + str(ret))

    # 2. 上传文件(覆盖文件)
    #    将本地的local_file_2.txt上传到bucket的根分区下,覆盖已上传的sample_file.txt
    with open('local_file_2.txt', 'w') as f:
        f.write("hello world2")
    request = UploadFileRequest(bucket, u'/sample_file.txt',
                                u'local_file_2.txt')
    request.set_insert_only(0)  # 设置允许覆盖
    upload_file_ret = cos_client.upload_file(request)
    logger.info('overwrite file, return message:' + str(upload_file_ret))

    # 3. 获取文件属性
    request = StatFileRequest(bucket, u'/sample_file.txt')
    stat_file_ret = cos_client.stat_file(request)
    logger.info('stat file, return message: ' + str(stat_file_ret))

    # 4. 更新文件属性
    request = UpdateFileRequest(bucket, u'/sample_file.txt')

    request.set_biz_attr(u'这是个demo文件')  # 设置文件biz_attr属性
    request.set_authority(u'eWRPrivate')  # 设置文件的权限
    request.set_cache_control(u'cache_xxx')  # 设置Cache-Control
    request.set_content_type(u'application/text')  # 设置Content-Type
    request.set_content_disposition(u'ccccxxx.txt')  # 设置Content-Disposition
    request.set_content_language(u'english')  # 设置Content-Language
    request.set_x_cos_meta(u'x-cos-meta-xxx', u'xxx')  # 设置自定义的x-cos-meta-属性
    request.set_x_cos_meta(u'x-cos-meta-yyy', u'yyy')  # 设置自定义的x-cos-meta-属性

    update_file_ret = cos_client.update_file(request)
    logger.info('update file,  return message: ' + str(update_file_ret))

    # 5. 更新后再次获取文件属性
    request = StatFileRequest(bucket, u'/sample_file.txt')
    stat_file_ret = cos_client.stat_file(request)
    logger.info('stat file, return message: ' + str(stat_file_ret))

    ############################################################################
    # 目录操作                                                                 #
    ############################################################################
    # 1. 生成目录, 目录名为sample_folder
    request = CreateFolderRequest(bucket, u'/sample_folder/')
    create_folder_ret = cos_client.create_folder(request)
    logger.info('create folder ret:' + str(create_folder_ret))

    # 2. 更新目录的biz_attr属性
    request = UpdateFolderRequest(bucket, u'/sample_folder/', u'这是一个测试目录')
    update_folder_ret = cos_client.update_folder(request)
    logger.info('update folder ret:' + str(update_folder_ret))

    # 3. 获取目录属性
    request = StatFolderRequest(bucket, u'/sample_folder/')
    stat_folder_ret = cos_client.stat_folder(request)
    logger.info("stat folder, return message: " + str(stat_folder_ret))

    # 4. list目录, 获取目录下的成员
    request = ListFolderRequest(bucket, u'/sample_folder/')
    list_folder_ret = cos_client.list_folder(request)
    logger.info("list folder, return message: " + str(list_folder_ret))
    # 5. 删除目录
    request = DelFolderRequest(bucket, u'/sample_folder/')
    delete_folder_ret = cos_client.del_folder(request)
    logger.info("delete folder, return message: " + str(delete_folder_ret))
コード例 #5
0
def cos_demo():
    # 设置用户属性, 包括appid, secret_id和secret_key
    # 这些属性可以在cos控制台获取(https://console.qcloud.com/cos)
    appid = 100000  # 替换为用户的appid
    secret_id = u'xxxxxxxx'  # 替换为用户的secret_id
    secret_key = u'xxxxxxx'  # 替换为用户的secret_key
    cos_client = CosClient(appid, secret_id, secret_key)

    # 设置要操作的bucket
    bucket = u'mybucket'

    ############################################################################
    # 文件操作                                                                 #
    ############################################################################
    # 1. 上传文件(默认不覆盖)
    #    将本地的local_file_1.txt上传到bucket的根分区下,并命名为sample_file.txt
    #    默认不覆盖, 如果cos上文件存在,则会返回错误
    request = UploadFileRequest(bucket, u'/sample_file.txt',
                                u'local_file_1.txt')
    upload_file_ret = cos_client.upload_file(request)
    print 'upload file ret:', repr(upload_file_ret)

    # 2. 上传文件(覆盖文件)
    #    将本地的local_file_2.txt上传到bucket的根分区下,覆盖已上传的sample_file.txt
    request = UploadFileRequest(bucket, u'/sample_file.txt',
                                u'local_file_2.txt')
    request.set_insert_only(0)  # 设置允许覆盖
    upload_file_ret = cos_client.upload_file(request)
    print 'overwrite file ret:', repr(upload_file_ret)

    # 3. 获取文件属性
    request = StatFileRequest(bucket, u'/sample_file.txt')
    stat_file_ret = cos_client.stat_file(request)
    print 'stat file ret:', repr(stat_file_ret)

    # 4. 更新文件属性
    request = UpdateFileRequest(bucket, u'/sample_file.txt')

    request.set_biz_attr(u'这是个demo文件')  # 设置文件biz_attr属性
    request.set_authority(u'eWRPrivate')  # 设置文件的权限
    request.set_cache_control(u'cache_xxx')  # 设置Cache-Control
    request.set_content_type(u'application/text')  # 设置Content-Type
    request.set_content_disposition(u'ccccxxx.txt')  # 设置Content-Disposition
    request.set_content_language(u'english')  # 设置Content-Language
    request.set_x_cos_meta(u'x-cos-meta-xxx', u'xxx')  # 设置自定义的x-cos-meta-属性
    request.set_x_cos_meta(u'x-cos-meta-yyy', u'yyy')  # 设置自定义的x-cos-meta-属性

    update_file_ret = cos_client.update_file(request)
    print 'update file ret:', repr(update_file_ret)

    # 5. 更新后再次获取文件属性
    request = StatFileRequest(bucket, u'/sample_file.txt')
    stat_file_ret = cos_client.stat_file(request)
    print 'stat file ret:', repr(stat_file_ret)

    # 6. 移动文件, 将sample_file.txt移动位sample_file_move.txt
    request = MoveFileRequest(bucket, u'/sample_file.txt',
                              u'/sample_file_move.txt')
    stat_file_ret = cos_client.move_file(request)
    print 'move file ret:', repr(stat_file_ret)

    # 7. 删除文件
    request = DelFileRequest(bucket, u'/sample_file_move.txt')
    del_ret = cos_client.del_file(request)
    print 'del file ret:', repr(del_ret)

    ############################################################################
    # 目录操作                                                                 #
    ############################################################################
    # 1. 生成目录, 目录名为sample_folder
    request = CreateFolderRequest(bucket, u'/sample_folder/')
    create_folder_ret = cos_client.create_folder(request)
    print 'create folder ret:', create_folder_ret

    # 2. 更新目录的biz_attr属性
    request = UpdateFolderRequest(bucket, u'/sample_folder/', u'这是一个测试目录')
    update_folder_ret = cos_client.update_folder(request)
    print 'update folder ret:', repr(update_folder_ret)

    # 3. 获取目录属性
    request = StatFolderRequest(bucket, u'/sample_folder/')
    stat_folder_ret = cos_client.stat_folder(request)
    print 'stat folder ret:', repr(stat_folder_ret)

    # 4. list目录, 获取目录下的成员
    request = ListFolderRequest(bucket, u'/sample_folder/')
    list_folder_ret = cos_client.list_folder(request)
    print 'list folder ret:', repr(list_folder_ret)

    # 5. 删除目录
    request = DelFolderRequest(bucket, u'/sample_folder/')
    delete_folder_ret = cos_client.del_folder(request)
    print 'delete folder ret:', repr(delete_folder_ret)
コード例 #6
0
ファイル: sample.py プロジェクト: tencentyun/cos-python-sdk
def cos_demo():
    # 设置用户属性, 包括appid, secret_id和secret_key
    # 这些属性可以在cos控制台获取(https://console.qcloud.com/cos)
    appid = 100000  # 替换为用户的appid
    secret_id = u"xxxxxxxx"  # 替换为用户的secret_id
    secret_key = u"xxxxxxx"  # 替换为用户的secret_key
    cos_client = CosClient(appid, secret_id, secret_key)

    # 设置要操作的bucket
    bucket = u"mybucket"

    ############################################################################
    # 文件操作                                                                 #
    ############################################################################
    # 1. 上传文件(默认不覆盖)
    #    将本地的local_file_1.txt上传到bucket的根分区下,并命名为sample_file.txt
    #    默认不覆盖, 如果cos上文件存在,则会返回错误
    request = UploadFileRequest(bucket, u"/sample_file.txt", u"local_file_1.txt")
    upload_file_ret = cos_client.upload_file(request)
    print "upload file ret:", repr(upload_file_ret)

    # 2. 上传文件(覆盖文件)
    #    将本地的local_file_2.txt上传到bucket的根分区下,覆盖已上传的sample_file.txt
    request = UploadFileRequest(bucket, u"/sample_file.txt", u"local_file_2.txt")
    request.set_insert_only(0)  # 设置允许覆盖
    upload_file_ret = cos_client.upload_file(request)
    print "overwrite file ret:", repr(upload_file_ret)

    # 3. 获取文件属性
    request = StatFileRequest(bucket, u"/sample_file.txt")
    stat_file_ret = cos_client.stat_file(request)
    print "stat file ret:", repr(stat_file_ret)

    # 4. 更新文件属性
    request = UpdateFileRequest(bucket, u"/sample_file.txt")

    request.set_biz_attr(u"这是个demo文件")  # 设置文件biz_attr属性
    request.set_authority(u"eWRPrivate")  # 设置文件的权限
    request.set_cache_control(u"cache_xxx")  # 设置Cache-Control
    request.set_content_type(u"application/text")  # 设置Content-Type
    request.set_content_disposition(u"ccccxxx.txt")  # 设置Content-Disposition
    request.set_content_language(u"english")  # 设置Content-Language
    request.set_x_cos_meta(u"x-cos-meta-xxx", u"xxx")  # 设置自定义的x-cos-meta-属性
    request.set_x_cos_meta(u"x-cos-meta-yyy", u"yyy")  # 设置自定义的x-cos-meta-属性

    update_file_ret = cos_client.update_file(request)
    print "update file ret:", repr(update_file_ret)

    # 5. 更新后再次获取文件属性
    request = StatFileRequest(bucket, u"/sample_file.txt")
    stat_file_ret = cos_client.stat_file(request)
    print "stat file ret:", repr(stat_file_ret)

    # 6. 移动文件, 将sample_file.txt移动位sample_file_move.txt
    request = MoveFileRequest(bucket, u"/sample_file.txt", u"/sample_file_move.txt")
    stat_file_ret = cos_client.move_file(request)
    print "move file ret:", repr(stat_file_ret)

    # 7. 删除文件
    request = DelFileRequest(bucket, u"/sample_file_move.txt")
    del_ret = cos_client.del_file(request)
    print "del file ret:", repr(del_ret)

    ############################################################################
    # 目录操作                                                                 #
    ############################################################################
    # 1. 生成目录, 目录名为sample_folder
    request = CreateFolderRequest(bucket, u"/sample_folder/")
    create_folder_ret = cos_client.create_folder(request)
    print "create folder ret:", create_folder_ret

    # 2. 更新目录的biz_attr属性
    request = UpdateFolderRequest(bucket, u"/sample_folder/", u"这是一个测试目录")
    update_folder_ret = cos_client.update_folder(request)
    print "update folder ret:", repr(update_folder_ret)

    # 3. 获取目录属性
    request = StatFolderRequest(bucket, u"/sample_folder/")
    stat_folder_ret = cos_client.stat_folder(request)
    print "stat folder ret:", repr(stat_folder_ret)

    # 4. list目录, 获取目录下的成员
    request = ListFolderRequest(bucket, u"/sample_folder/")
    list_folder_ret = cos_client.list_folder(request)
    print "list folder ret:", repr(list_folder_ret)

    # 5. 删除目录
    request = DelFolderRequest(bucket, u"/sample_folder/")
    delete_folder_ret = cos_client.del_folder(request)
    print "delete folder ret:", repr(delete_folder_ret)
コード例 #7
0
ファイル: cos_demo.py プロジェクト: lazywhite/python
def cos_demo():
    # 设置用户属性, 包括appid, secret_id和secret_key
    # 这些属性可以在cos控制台获取(https://console.qcloud.com/cos)
    appid = 111               # 替换为用户的appid
    secret_id = u''         # 替换为用户的secret_id
    secret_key = u''         # 替换为用户的secret_key
    region = "shanghai" #           # 替换为用户的region,目前可以为 shanghai/guangzhou
    cos_client = CosClient(appid, secret_id, secret_key, region)

    # 设置要操作的bucket
    bucket = u''

    ############################################################################
    # 文件操作                                                                 #
    ############################################################################
    # 1. 上传文件(默认不覆盖)
    #    将本地的local_file_1.txt上传到bucket的根分区下,并命名为sample_file.txt
    #    默认不覆盖, 如果cos上文件存在,则会返回错误

    request = UploadFileRequest(bucket, u'/sample_file.txt', u'local_file_1.txt')
    upload_file_ret = cos_client.upload_file(request)

    logger.info("upload file, return message: " + str(upload_file_ret))

    #  分片上传大文件

    request = UploadSliceFileRequest(bucket, u'/sample_bigfile.txt', u'local_bigfile.txt')
    ret = cos_client.upload_slice_file(request)
    logger.info("slice upload, return message: " + str(ret))

    # 2. 上传文件(覆盖文件)
    #    将本地的local_file_2.txt上传到bucket的根分区下,覆盖已上传的sample_file.txt
    with open('local_file_2.txt', 'w') as f:
        f.write("hello world2")
    request = UploadFileRequest(bucket, u'/sample_file.txt', u'local_file_2.txt')
    request.set_insert_only(0)  # 设置允许覆盖
    upload_file_ret = cos_client.upload_file(request)
    logger.info('overwrite file, return message:' + str(upload_file_ret))

    # 3. 获取文件属性
    request = StatFileRequest(bucket, u'/sample_file.txt')
    stat_file_ret = cos_client.stat_file(request)
    logger.info('stat file, return message: ' + str(stat_file_ret))

    # 4. 更新文件属性
    request = UpdateFileRequest(bucket, u'/sample_file.txt')

    request.set_biz_attr(u'这是个demo文件')           # 设置文件biz_attr属性
    request.set_authority(u'eWRPrivate')              # 设置文件的权限
    request.set_cache_control(u'cache_xxx')           # 设置Cache-Control
    request.set_content_type(u'application/text')     # 设置Content-Type
    request.set_content_disposition(u'ccccxxx.txt')   # 设置Content-Disposition
    request.set_content_language(u'english')          # 设置Content-Language
    request.set_x_cos_meta(u'x-cos-meta-xxx', u'xxx')  # 设置自定义的x-cos-meta-属性
    request.set_x_cos_meta(u'x-cos-meta-yyy', u'yyy')  # 设置自定义的x-cos-meta-属性

    update_file_ret = cos_client.update_file(request)
    logger.info('update file,  return message: ' + str(update_file_ret))

    # 5. 更新后再次获取文件属性
    request = StatFileRequest(bucket, u'/sample_file.txt')
    stat_file_ret = cos_client.stat_file(request)
    logger.info('stat file, return message: ' + str(stat_file_ret))

    ############################################################################
    # 目录操作                                                                 #
    ############################################################################
    # 1. 生成目录, 目录名为sample_folder
    request = CreateFolderRequest(bucket, u'/sample_folder/')
    create_folder_ret = cos_client.create_folder(request)
    logger.info('create folder ret:' + str(create_folder_ret))

    # 2. 更新目录的biz_attr属性
    request = UpdateFolderRequest(bucket, u'/sample_folder/', u'这是一个测试目录')
    update_folder_ret = cos_client.update_folder(request)
    logger.info('update folder ret:' + str(update_folder_ret))

    # 3. 获取目录属性
    request = StatFolderRequest(bucket, u'/sample_folder/')
    stat_folder_ret = cos_client.stat_folder(request)
    logger.info("stat folder, return message: " + str(stat_folder_ret))

    # 4. list目录, 获取目录下的成员
    request = ListFolderRequest(bucket, u'/sample_folder/')
    list_folder_ret = cos_client.list_folder(request)
    logger.info("list folder, return message: " + str(list_folder_ret))
    # 5. 删除目录
    request = DelFolderRequest(bucket, u'/sample_folder/')
    delete_folder_ret = cos_client.del_folder(request)
    logger.info("delete folder, return message: " + str(delete_folder_ret))
コード例 #8
0
class CosV4StorageService(storage_service.StorageService):

    def __init__(self, *args, **kwargs):

        appid = int(kwargs['appid'])
        region = kwargs['region']
        accesskeyid = unicode(kwargs['accesskeyid'])
        accesskeysecret = unicode(kwargs['accesskeysecret'])
        bucket = unicode(kwargs['bucket'])
        if 'prefix_dir' in kwargs:
            self._prefix_dir = kwargs['prefix_dir']
        else:
            self._prefix_dir = None

        # filelist存在时, prefix_dir不生效
        if 'filelist' in kwargs:
            self._filelist = kwargs['filelist']
            self._prefix_dir = None
        else:
            self._filelist = None

        if 'sync_files' in kwargs:
            self._sync_files_dir = kwargs['sync_files']
        else:
            self._sync_files_dir = '/tmp/workspace/sync_files'

        self._cos_api = CosClient(appid, accesskeyid, accesskeysecret, region=region)
        self._bucket = bucket
        self._overwrite = kwargs['overwrite'] == 'true' if 'overwrite' in kwargs else False
        self._max_retry = 20

    def download(self, task, local_path):
        return self._download(task, local_path, False)


    def _download(self, task, local_path, is_ignore_size):
        for i in range(20):
            logger.info("download file with rety {0}".format(i))
            import os
            try:
                os.remove(task.key)
            except:
                pass
            req = DownloadFileRequest(self._bucket, task.key, local_path)
            ret = self._cos_api.download_file(req)

            logger.debug(str(ret))
            if ret['code'] != 0:
                logger.error("error code: " + str(ret['code']))
                raise IOError("Download Failed, ret=" + str(ret))

            if is_ignore_size:
                logger.info("Download Successfully, break")
                break

            if task.size is None:
                logger.info("task's size is None, skip check file size on local")
                break

            from os import path
            task_size = 0
            if isinstance(task.size, int):
                task_size = task.size
            else:
                task_size = int(task.size['filelen'])

            if path.getsize(local_path) != task_size:
                logger.error("Download Failed, size1: {size1}, size2: {size2}".format(size1=path.getsize(local_path),
                                                                                      size2=task_size))
            else:
                logger.info("Download Successfully, break")
                break
        else:
            raise IOError("Download Failed with 20 retry")

    def upload(self, task, local_path):
        cos_path = task.key
        if not cos_path.startswith('/'):
            cos_path = '/' + cos_path

        if self._prefix_dir:
            cos_path = self._prefix_dir + cos_path

        if isinstance(local_path, unicode):
            local_path.encode('utf-8')
        insert_only = 0 if self._overwrite else 1
        for i in range(10):
            try:
                upload_request = UploadFileRequest(self._bucket, unicode(cos_path), local_path, insert_only=insert_only)
                upload_file_ret = self._cos_api.upload_file(upload_request)

                if upload_file_ret[u'code'] != 0:
                    logger.warn("upload failed:" + str(upload_file_ret))
                    raise OSError("UploadError: " + str(upload_file_ret))
                else:
                    break
            except:
                pass
        else:
            raise IOError("upload failed")

    def list(self, marker):
        if self._filelist is not None and len(self._filelist) > 0:
            filelist_path = self._sync_files_dir + '/' + os.path.basename(self._filelist)
	    filelist_task = Task(self._filelist, None, None, None)
            self._download(filelist_task, filelist_path, True)
            with open(filelist_path) as f:
                line = f.readline()
                while line:
                    if not line.startswith('/'):
                        line = '/' + line
                    task = self.get_task_by_key(line.strip())
                    yield task
                    line = f.readline()
        else:
            if self._prefix_dir is None:
                for i in self.dfs('/'):
                    yield i
            else:
                for i in self.dfs(self._prefix_dir):
                    yield i

    def dfs(self, path):
        print "DFS: {path}".format(path=to_utf8(path))
        _finish = False
        _context = u''
        max_retry = self._max_retry

        path = to_unicode(path)

        while not _finish:
            request = ListFolderRequest(bucket_name=self._bucket, cos_path=path, context=_context)
            request.set_delimiter = '/'
            ret = self._cos_api.list_folder(request)
            logger.debug(str(ret))

            if ret['code'] != 0:
                max_retry -= 1
            else:
                _finish = ret['data']['listover']
                _context = ret['data']['context']
                for item in ret['data']['infos']:
                    if 'filelen' in item:
                        try:
                            key = "{prefix}{filename}".format(prefix=path, filename=item['name'])
                            logger.info("key=%s", key)
                            yield Task(key, item, None, None)
                        except:
                            pass
                    else:
                        _sub_dir = "{prefix}{filename}".format(prefix=path.encode('utf-8'),
                                                               filename=item['name'].encode('utf-8'))
                        for i in self.dfs(_sub_dir):
                            yield i

            if max_retry == 0:
                _finish = True

    def exists(self, task):
        _path = task.key
        _size = task.size

        if not _path.startswith('/'):
            _path = '/' + _path
        logger = getLogger(__name__)
        # logger.info("func: exists: " + str(_path))
        if self._prefix_dir:
            _path = self._prefix_dir + _path

        if isinstance(_path, str):
            _path = _path.decode('utf-8')
        request = StatFileRequest(self._bucket, _path)
        ret = self._cos_api.stat_file(request)
        logger.debug("ret: " + str(ret))
        # import json
        # v = json.loads(ret)
        if ret['code'] != 0:
            # logger.warn("error code: " + str(ret['code']))
            return False

        if int(ret['data']['filelen']) != int(ret['data']['filesize']):
            logger.warn("file is broken, filelen: {len}, filesize: {size}".format(
                len=ret['data']['filelen'],
                size=ret['data']['filesize']
            ))
            return False
        elif _size is not None and int(ret['data']['filelen']) != int(_size):
            return False
        return True

    def get_task_by_key(self, key):
        _path = key

        if not _path.startswith('/'):
            _path = '/' + _path
        logger = getLogger(__name__)

        if isinstance(_path, str):
            _path = _path.decode('utf-8')
        request = StatFileRequest(self._bucket, _path)
        ret = self._cos_api.stat_file(request)
        logger.info("ret: " + str(ret))
        # import json
        # v = json.loads(ret)
        if ret['code'] != 0:
            logger.warn("get task by key error, key = {},error code: {}".format(key, str(ret['code'])))
            return Task(key, None, None, None)

        return Task(key, int(ret['data']['filesize']), None, None)