def __new__(cls): '''单例模式''' if cls.instance is None: obj = super().__new__(cls) obj._client = Fdfs_client(get_tracker_conf(FASTFDFS_CONFIG_PATH)) cls.instance = obj return cls.instance
def _save(self, name, content): ''' 文件上传 :param name: 上传文件名称 :param content: 上传文件内容 File 对象自身 :return: 上传成功文件名 ''' # 实例化对象 trackers = get_tracker_conf(self.fdfs_conf) client = Fdfs_client(trackers) # 使用上传内容方法 res = client.upload_appender_by_buffer(content.read()) # @return dict # { # 'Group name': group_name, # 'Remote file_id': remote_file_id, # 'Status': 'Upload successed.', # 'Local file name': '', # 'Uploaded size': upload_size, # 'Storage IP': storage_ip # } # 文件上传失败 if res.get('Status') != 'Upload successed.': # 谁调用谁出来异常 raise Exception('文件上传失败!') name = res.get('Remote file_id') # 不编码会报错 return name.decode()
def test_file_info(): from fdfs_client import client cli = client.Fdfs_client( client.get_tracker_conf('~/.local/etc/fdfs/client.conf')) ret = cli.query_file_info( 'group1/M00/00/1D/oYYBAF78D_uAQPHKACQBXRgNsdk46.json') print(ret)
def _save(self, name, content): ''' 保存文件时使用 :param name: 你选择上传文件的名字 :param content: 包含你上传文件内容的File对象 :return: ''' # 创建Fdfs_client对象 client = Fdfs_client(get_tracker_conf(self.client_conf)) # 上传文件到fast_dfs文件系统 result = client.upload_by_buffer(content.read()) # retsult # { # 'Group name': b'group1', # 'Remote file_id': b'group1/M00/00/00/rBLk_lxmOXeAcMArAAFNqduP814053.png', # 'Status': 'Upload successed.', # 'Local file name': './utils/a.png', # 'Uploaded size': '83.42KB', # 'Storage IP': b'47.107.176.243' # } if result.get('Status') != 'Upload successed.': # 上传失败 raise Exception('上传文件到fast_fdfs失败') # 获取返回的文件id file_id = result.get('Remote file_id').decode() return file_id
def _save(self, name, content): ''' 保存文件时使用 :param name: 上传文件的文件名 :param content: 上传文件的File对象 :return:Fast DFS中保存的id信息 ''' #创建一个 Fdfs_client 对象 trackers = get_tracker_conf(self.client_conf) client = Fdfs_client(trackers) #上传文件到fdfs系统中 ret = client.upload_by_buffer(content.read()) ''' dict { 'Group name' : group_name, 'Remote file_id' : remote_file_id, 'Status' : 'Upload successed.', 'Local file name' : '', 'Uploaded size' : upload_size, 'Storage IP' : storage_ip } ''' if ret.get('Status') != 'Upload successed.': # 上传失败 raise Exception('上次文件到Fast DFS失败') # 获取返回的文件id filename = ret.get('Remote file_id') return filename.decode()
def _save(self, name, content, max_length=None): '''保存文件时调用''' # name: 上传文件名 # content: File类的一个对象,包含上传文件内容 conf = get_tracker_conf(self.conf_path) client = Fdfs_client(conf) ret = client.upload_by_buffer(content.read()) ''' @return dict { 'Group name' : group_name, 'Remote file_id' : remote_file_id, 'Status' : 'Upload successed.', 'Local file name' : '', 'Uploaded size' : upload_size, 'Storage IP' : storage_ip } if success else None ''' if ret.get('Status') != 'Upload successed.': raise Exception('上传失败') else: file_id = ret.get('Remote file_id') # debug:file_id 是字节型数据,需要转换成str return file_id.decode()
def _save(self, name, content): '''保存文件时使用''' # name:你选择上传文件的名字 # content:包含你上传文件内容的File对象 # 创建一个Fdfs_client对象 trackers = get_tracker_conf(self.client_conf) client = Fdfs_client(trackers) # 上传文件到fdfs中 res = client.upload_by_buffer(content.read()) # dict # { # 'Group name': group_name, # 'Remote file_id': remote_file_id, # 'Status': 'Upload successed.', # 'Local file name': '', # 'Uploaded size': upload_size, # 'Storage IP': storage_ip # } if res.get('Status') != 'Upload successed.': # 上传失败 raise Exception('上次文件到fast dfs失败') # 获取返回的文件id filename = res.get('Remote file_id') # filename = res.get('Remote file_id')返回的是bytes类型。那么,我们要把其从字节类型转换到字符串类型。使用decode()函数,把字节类型的filename转换到字符串类型 return filename.decode()
def _uploag_fastdfs(self, files): current_path = os.path.split(os.path.realpath(__file__))[0] config_path = os.path.join(current_path, "client.conf") tracker_path = get_tracker_conf(config_path) client = Fdfs_client(tracker_path) ret_upload = client.upload_by_buffer(files.read(), file_ext_name="png") file_path = ret_upload['Remote file_id'].decode() return file_path
def __init__(self, client_conf=None, base_url=None): '''初始化(传参数,避免url那些固定死)''' if client_conf is None: client_conf = get_tracker_conf(settings.FDFS_CLIENT_CONF) self.client_conf = client_conf if base_url is None: base_url = settings.FDFS_URL self.base_url = base_url
class FastDFSStorage: conf_path = get_tracker_conf(CONFIG.FASTDFS_CONF_PATH) def upload(self, content, ext_name=None): cli = Fdfs_client(self.conf_path) if ext_name is not None: ext_name = ext_name.lstrip('.') fbuffer = aes_encrypt(content.read(), key=CONFIG.FILE_SECRET) result = cli.upload_by_buffer(fbuffer, file_ext_name=ext_name) logger.debug(f'FastDFS Upload: {result}') if result.get('Status') != 'Upload successed.': raise errors.Error(errmsg=f'上传文件到FastDFS失败: {result}') storage_ip = result.get('Storage IP') filename = result.get('Remote file_id') return { 'filename': filename.decode(), 'storage_ip': storage_ip.decode() } def download(self, name): cli = Fdfs_client(self.conf_path) if not isinstance(name, bytes): name = name.encode() try: result = cli.download_to_buffer(name) except FDFSError as e: raise errors.Error(errmsg=f'从FastDFS下载文件{name}失败:') from e # logger.debug(f'FastDFS download: {result}') content = result.get('Content') # remote_file_id = result.get('Remote file_id') # storage_ip = result.get('Storage IP') # size = result.get('Download size') return aes_decrypt(content, key=CONFIG.FILE_SECRET, a2b=False) def delete(self, name): cli = Fdfs_client(self.conf_path) if not isinstance(name, bytes): name = name.encode() try: result = cli.delete_file(name) except FDFSError as e: raise errors.Error(errmsg=f'从FastDFS删除文件{name}失败:') from e logger.debug(f'FastDFS delete: {result}') if result[0] != 'Delete file successed.': raise errors.Error(errmsg=f'FastDFS删除文件{name}失败: {result}') def get_token(self, filename, ts, secret): """用于生成http防盗链,目前不需要""" if isinstance(filename, str): filename = filename.encode() if isinstance(ts, int): ts = str(ts) if isinstance(ts, str): ts = ts.encode() if isinstance(secret, str): secret = secret.encode() s = filename + secret + ts return md5(s).hexdigest()
def redisControl(self, frame): test = Fdfs_client(get_tracker_conf('./client.conf')) real, buff = cv2.imencode('.jpg', frame) ret_upload = test.upload_appender_by_buffer(buff.tobytes(), 'jpg') self.redis.hset( "PresetPosition", '"{}:{}"'.format(self.plan_id, self.number), '"{}"'.format(ret_upload.get("Remote file_id").decode())) log.info("采集编号:[{}]-采集过程id:[{}]-拍照成功".format(self.plan_id, self.number))
def upload_by_buffer(string): client_path = os.path.join( os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'client.conf') client = Fdfs_client(get_tracker_conf(client_path)) res = client.upload_by_buffer(string.encode('utf-8'), file_ext_name='log') if res['Status'] == 'Upload successed.': return res['Remote file_id'].decode() else: raise Exception(res['Status'])
def upload_file(file_path): client_path = os.path.join( os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'client.conf') client = Fdfs_client(get_tracker_conf(client_path)) res = client.upload_by_filename(file_path) if res['Status'] == 'Upload successed.': return res['Remote file_id'].decode() else: raise Exception(res['Status'])
def _save(self, name, content): '''上传到fdfs''' client_conf_obj = get_tracker_conf(self.client_conf) client = Fdfs_client(client_conf_obj) ret = client.upload_appender_by_buffer(content.read()) if ret.get('Status') != 'Upload successed.': raise Exception('上传到fdfs失败') return ret.get('Remote file_id')
def fastDFSStorage(name, content): """自定义上传文件""" tracker_path = get_tracker_conf('./utils/fdfs/client.conf') client = Fdfs_client(tracker_path) res = client.upload_appender_by_buffer(content.read()) if res.get('Status') != 'Upload successed.': # 上传失败 raise Exception('上传文件到fast dfs失败') # 获取返回的文件ID filename = res.get('Remote file_id') return filename.decode()
def save(self, name, content, max_length=None): client_conf = get_tracker_conf(self.client_conf) client = Fdfs_client(client_conf) file_ext_name = os.path.splitext(name)[1].replace('.', '') #这里需要动态传入文件扩展名,否则返回的地址中没有扩展名导致文件无法访问 res = client.upload_by_buffer(content.read(), file_ext_name=file_ext_name) if res.get('Status') != 'Upload successed.': raise Exception('上传文件到fdfs失败了!') filename = res.get('Remote file_id') return filename.decode()
def __init__(self, base_url=None, client_conf=None): """ 初始化 :param base_url:构造图片上传的基本url,包括域名,已经搭配nginx :param client_conf:FastDfs客户端的配置字典 """ if base_url is None: base_url = FDFS_URL self.base_url = base_url if client_conf is None: client_conf = FDFS_CLIENT_CONF self.client_conf = client_conf self.client = Fdfs_client(get_tracker_conf(self.client_conf))
def __new__(cls, *args, **kwargs): # 判断有没有已经创建好的对象,如果没有,创建一个对象,并且保存 # 如果有,则将保存的对象返回 if cls.instance is None: obj = super().__new__(cls) # 创建客户端链接对象 # 1、创建一个Fdfs_client对象,创建过程中需要指定一个client的配置文件,django在查找内容的时候,是从根目录开始查找,而不是相对路径,因此如果写相对路径就会报错 # 由配置文件中的信息 得到 字典trackers obj.tracker = get_tracker_conf(FDFS_CLIENT_CONF) # tracker = get_tracker_conf('./client.conf') obj.client = Fdfs_client(obj.tracker) cls.instance = obj return cls.instance
def upload_fdfs(path: str): """ #上传FDFS,api :param path:文件的绝对路径 :return: 上传后FDFS返回的信息 """ trackers = get_tracker_conf(TRCKER_CONF) client = Fdfs_client(trackers) ret = client.upload_by_filename(path) if ret.get('Status') == 'Upload successed.': return ret return
def _save(self, name, content): """保存文件""" client = Fdfs_client(get_tracker_conf(self.client_conf)) res = client.upload_by_buffer(content.read()) if res.get('Status') != 'Upload successed.': # 上传失败 raise Exception('上传文件到fast dfs失败') # 获取返回的文件ID filename = res.get('Remote file_id') return filename.decode()
def test_regenerate_appender_file_name(): from fdfs_client import client cli = client.Fdfs_client(client.get_tracker_conf('~/.local/etc/fdfs/client.conf')) ret = cli.upload_appender_by_buffer(b'just a test', 'test') file_id = ret.get('Remote file_id') try: print(file_id) ret2 = cli.regenerate_appender_filename(file_id) print('regenerate appender filename: ', ret) ret3 = cli.delete_file(ret2.get('Remote file_id')) print('delete result', ret3) except: ret4 = cli.delete_file(ret.get('Remote file_id')) print('delete result', ret4) raise
def create(self, validated_data): path = get_tracker_conf(conf_path=settings.FASTDFS_PATH) client = Fdfs_client(path) request = self.context["request"] file = request.FILES.get('image') res = client.upload_by_buffer(file.read()) if res["Status"] != 'Upload successed.': raise serializers.ValidationError({'error': '图片上传失败'}) # 获取上传后的路径 image_url = res['Remote file_id'].decode() # 获取sku_id sku_id = request.data.get('sku')[0] # 保存图片 img = SKUImage.objects.create(sku_id=sku_id, image=image_url) # get_detail_html.delay(img.sku_id) return img
def _save(self, name, content): """ 在FastDFS中保存文件 :param name: 传入的文件名 :param content: 文件内容 :return: 保存到数据库中的FastDFS的文件名 """ client_conf_obj = get_tracker_conf(self.option.get('CLIENT_CONF')) client = Fdfs_client(client_conf_obj) ret = client.upload_by_buffer(content.read()) if ret.get("Status") != "Upload successed.": raise Exception("upload file failed") file_name = ret.get("Remote file_id") # file_name为bytes类型,只能返回str类型,不然会报错 return file_name.decode()
def post(self, request, *args, **kwargs): upload_image = request.FILES.get("editormd-image-file", None) # image none check if not upload_image: return HttpResponse( json.dumps({ 'success': 0, 'message': "未获取到要上传的图片", 'url': "" })) # image format check file_name_list = upload_image.name.split('.') file_extension = file_name_list.pop(-1) if file_extension not in MDEDITOR_CONFIGS['upload_image_formats']: return HttpResponse( json.dumps({ 'success': 0, 'message': "上传图片格式错误,允许上传图片格式为:%s" % ','.join(MDEDITOR_CONFIGS['upload_image_formats']), 'url': "" })) # FDFS 存储文件 client_conf_obj = get_tracker_conf(self.option.get('CLIENT_CONF')) client = Fdfs_client(client_conf_obj) ret = client.upload_by_buffer(upload_image.read()) if ret.get("Status") != "Upload successed.": return HttpResponse( json.dumps({ 'success': 0, 'message': "上传失败:%s" % str(ret.get("Status")), 'url': "" })) file_name = ret.get("Remote file_id").decode() return HttpResponse( json.dumps({ 'success': 1, 'message': "上传成功!", 'url': self.option.get('BASE_URL') + file_name }))
def _save(self, name, content): """保存文件时使用""" # name:你选择的上传文件的名字 # content:包含你上传文件内容的File对象 # 创建一个Fdfs_clinet对象 client = Fdfs_client(get_tracker_conf('./utils/fdfs/client.conf')) # 上传文件到fast dfs系统中 res = client.upload_appender_by_buffer(content.read()) if res.get('Status') != 'Upload successed.': # 上传失败 raise Exception('上传文件到fast dfs失败') # 获取返回的文件ID filename = res.get('Remote file_id') return filename.decode()
def _save(self, name, content): # 保存文件时使用 # name: 你选择上传文件的名字 # content:包含你上传文件内容的File对象 # 创建Fdfs_client对象 trackers = get_tracker_conf('./utils/fdfs/client.conf') client = Fdfs_client(trackers=trackers) # 上传文件到fast dfs系统中 res = client.upload_by_buffer(content.read()) # 返回字典 # if res.get('Status') != 'Upload successed': # # 上传失败 # raise Exception('上传文件到fast dfs失败') # 获取返回的文件ID filename = res.get('Remote file_id') return filename.decode('utf8')
def _save(self, name, content): '''保存文件''' # name # 创建上传 conf_path = get_tracker_conf(self.client_conf) client = Fdfs_client(conf_path) # print('*' * 100) print(client) res = client.upload_by_buffer(content.read()) print(res) if res.get('Status') != 'Upload successed.': raise Exception('上传文件到fasf dfs失败') filename = res.get('Remote file_id') return filename.decode()
def _save(self, name, content): # 选择上传文件名字,content是File的一对象 包含上传文件 tracket_path = get_tracker_conf('./utils/fdfs/client.conf') # 路径相对项目dailyfresh client = Fdfs_client(tracket_path) print(content) print(type(content)) # 上传文件 try: # input() print('检测是否出错') res = client.upload_appender_by_buffer(content.read()) except Exception as result: print('异常%s' % result) """ dict { 'Group name': group_name, 'Remote file_id': remote_file_id, 'Status': 'Upload successed.', 'Local file name': '', 'Uploaded size': upload_size, 'Storage IP': storage_ip } """ if res.get('Status') != "Upload successed.": # 上传失败 print(res.get('Status')) print(res) # filename = res.get('Remote file_id') raise Exception('上传文件到fast dfs 失败') else: # 获取返回的ID filename = res.get('Remote file_id') return filename.decode()
def _save(self, name, content): """上传(保存)文件""" # 指定配置文件 # tracker_path = get_tracker_conf('./utils/fdfs/client.conf') tracker_path = get_tracker_conf(self.conf_path) client = Fdfs_client(tracker_path) # 上传文件到fdfs服务器,并接受一个fdfs服务器返回的File对象(字典型) receive = client.upload_by_buffer(content.read()) # {'Group name': 'group1', # 'Remote file_id': 'group1/M00/00/00/wKgrY2A4Ty2AVr7cAAPYbeRSiPo554.jpg', # 'Status': 'Upload successed.', # 'Local file name': '/home/image/Desktop/miku1.jpg', # 'Uploaded size': '246.00KB', # 'Storage IP': '192.168.43.99'} if receive.get('Status') != 'Upload successed.': raise Exception('文件上传fdfs服务器失败') # 修改返回对象:返回文件ID而不是File对象,浏览器接受时,会根据IP和文件ID渲染该地址的图片 fileid = receive.get('Remote file_id').decode() return fileid
def _save(self, name, context): # C:\Users\lzj\Desktop\df\utils\fdfs\client.conf trackers = get_tracker_conf(self.client_conf) client = Fdfs_client(trackers) res = client.upload_appender_by_buffer(context.read()) # dict # { # 'Group name': group_name, # 'Remote file_id': remote_file_id, # 'Status': 'Upload successed.', # 'Local file name': local_file_name, # 'Uploaded size': upload_size, # 'Storage IP': storage_ip # } if res.get('Status') != 'Upload successed.': raise Exception('上传失败') filename = res.get('Remote file_id') # return filename.encode() return filename