コード例 #1
0
ファイル: yun.py プロジェクト: naihe2010/alyc
    def isDownloaded(self, remote, local):
        """ 判断文件是否已成功下载
        """
        meta = self._meta(remote)
        if meta is None:
            return False

        lmd5 = autil.getfilemd5(local)
        return meta['md5'] == lmd5
コード例 #2
0
ファイル: yun.py プロジェクト: naihe2010/alyc
    def isUploaded(self, remote, local):
        """ 判断文件是否已成功上传
        目前实现基于MD5。但是,百度云的文件md5信息并不准确,
        但因为有秒传接口,多秒传一次文件,无伤大雅?
        """
        meta = self._meta(remote)
        if meta is None:
            return False

        lmd5 = autil.getfilemd5(local)
        return meta['md5'] == lmd5
コード例 #3
0
ファイル: baiduyun.py プロジェクト: naihe2010/alyc
    def rapidupload_file(self, path, file):
        size = os.path.getsize(file)

        if size < _slice_size:
            return (False, None)

        md5 = autil.getfilemd5(file)
        if not md5:
            return (False, None)

        fh = open(file, 'rb')
        if not fh:
            return (False, md5)

        data = fh.read(_block_size)
        crc = 0
        while len(data) > 0:
            crc = zlib.crc32(data, crc)
            data = fh.read(_block_size)

        fh.seek(0, 0)
        slice = fh.read(_slice_size)
        if len(slice) != _slice_size:
            return (False, md5)
        slicemd5 = hashlib.md5(slice).hexdigest()
        fh.close()

        js = self.__pcs_get_json(_pcs_uri + 'file',
                                 'rapidupload',
                                 {'path': path.encode('UTF-8'),
                                  'content-length': size,
                                  'content-md5': md5,
                                  'content-crc32': crc,
                                  'slice-md5': slicemd5,
                                  'ondup': 'overwrite'})
        if js and 'md5' in js and js['md5'] == md5:
            return (True, md5)
        else:
            return (False, md5)
コード例 #4
0
ファイル: baiduyun.py プロジェクト: naihe2010/alyc
    def upload_file(self, path, file, md5=None, callback=None):
        if self.canUpload(path, file) is not True:
            return False

        if not md5:
            md5 = autil.getfilemd5(file)

        if not md5:
            return False

        schd_path = self._path_schedule(path + file + md5)

        fh = open(file, 'rb')

        size = os.path.getsize(file)
        if size < _block_size:
            data = fh.read()
            fh.close()
            ret = self._upload(path, data, False)
            if ret is None:
                self._clear_schedule(schd_path)
                return False
            else:
                self._clear_schedule(schd_path)
                return True

        pre_schedule = self._load_schedule(schd_path)

        blocks = size / _super_max
        block_size = _block_size * (
            int(blocks / _block_size) + 1)

        already = 0
        schedule = {}

        while True:
            data = fh.read(block_size)
            if len(data) == 0:
                break

            fsizes = already
            tsizes = already + len(data) - 1
            chunkmd5 = self._get_schedule(pre_schedule, fsizes, tsizes)
            while not chunkmd5:
                chunkmd5 = self._upload(path, data, True)

            self._set_schedule(schedule, fsizes, tsizes, chunkmd5)
            self._store_schedule(schd_path, schedule)

            already += len(data)

            if callback:
                ret = callback(self, path, size, already)
                if ret is False:
                    fh.close()
                    return already

        fh.close()

        value = json.dumps({'block_list': self._list_schedule(schedule)})

        js = self.__pcs_post_json(_pcs_uri + 'file',
                                  'createsuperfile',
                                  {'path': path.encode('UTF-8'),
                                   'ondup': 'overwrite'},
                                  {},
                                  'param',
                                  None,
                                  value)
        self._clear_schedule(schd_path)
        if not js:
            return False
        elif js['size'] != size:
            return False
        else:
            return True