Exemple #1
0
 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
Exemple #2
0
    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()
Exemple #3
0
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)
Exemple #4
0
    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()
Exemple #6
0
    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()
Exemple #7
0
    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
Exemple #9
0
 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
Exemple #10
0
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()
Exemple #11
0
 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'])
Exemple #14
0
    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')
Exemple #15
0
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()
Exemple #16
0
    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))
Exemple #18
0
 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
Exemple #19
0
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
Exemple #20
0
    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
Exemple #22
0
 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()
Exemple #24
0
    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
            }))
Exemple #25
0
    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()
Exemple #26
0
    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')
Exemple #27
0
    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()
Exemple #28
0
    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()
Exemple #29
0
 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
Exemple #30
0
    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