def isDownloaded(self, remote, local): """ 判断文件是否已成功下载 """ meta = self._meta(remote) if meta is None: return False lmd5 = autil.getfilemd5(local) return meta['md5'] == lmd5
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
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)
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