Beispiel #1
0
    def _save(self,name,content):
        """
        被Storage.save()调用,保存文件时就会调用
        Django会将该方法的返回值保存到数据库中对应的文件字段,
        也就是说该方法应该返回要保存在数据库中的文件名称信息
        :param name: 要保存的文件名
        :param content: 要保存的文件对象
        :return: file_id 把上传后的文件路径返回
        """
        # 1.创建client

        # 固定文件路径形式
        # client = Fdfs_client('dpy_meiduo_mall/utils/fastdfs/client.conf')
        # 使用配置信息形式
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)

        # 可在无参数时实例化对象
        client = Fdfs_client(self.client_conf)

        # 2.上传文件到fastdfs

        # 绝对路径方式,此方法上传的图片,在storage中有文件后缀
        # ret = client.upload_by_filename('文件的绝对路径")

        # 把要上传的文件以二进制形式进行上传,没有后缀
        ret = client.upload_by_buffer(content.read())

        # 3.判断上传是否成功
        if ret.get('Status') != 'Upload successed.':
            raise Exception('Upload file failed')

        # 4.文件上传成功
        return ret.get('Remote file_id')
Beispiel #2
0
    def _save(self, name, content):
        """保存文件时使用"""
        # name:上传文件的名字
        # content:包含上传文件内容的file对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client("./utils/fdfs/client.conf")

        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 success else None
        '''
        if res.get('Status') != 'Upload successed.':
            # 上传失败
            raise Exception('上传文件到fastdfs失败')

        # 获取返回的文件ID
        filename = res.get('Remote file_id')

        return filename
Beispiel #3
0
    def _save(self, name, content):
        """
        当用户通过django管理后台上传文件时,
        django会调用此方法来保存用户上传的文件,
        我们可以重写此方法, 把文件上传到FastDFS服务器
        :param name:
        :param content: 内容 字节类型
        :return: 返回一个path给数据库
        默认返回:return super()._save(name, content)
        """
        # 连接fdfs
        client = Fdfs_client('utils/fdfs/client.conf')
        print(111)
        try:
            # 获取内容
            datas = content.read()
            # 保存图片 返回一个json
            result = client.upload_by_buffer(datas)
            status = result.get('Status')
            # 判断返回json中的status是否为success
            if 'Upload successed.' != status:
                raise Exception('上传文件到FaseDFS失败,status为{}'.format(status))
            path = result.get('Remote file_id')
        except Exception as e:
            print(e)
            raise e

        return path
Beispiel #4
0
    def save(self, name, content, max_length=None):
        client = Fdfs_client(self.client_conf)
        ret = client.upload_by_buffer(content.read())

        if ret['Status'] != 'Upload successed.':
            raise Exception("文件上传失败")
        return ret['Remote file_id']
Beispiel #5
0
    def _save(self, name, content):
        """保存文件时调用"""
        # name: 上传文件的名称 a.txt
        # content: File类的对象,包含了上传文件的内容

        # 上传文件到FDFS文件存储系统
        # client = Fdfs_client('客户配置文件路径')
        # client = Fdfs_client(os.path.join(settings.BASE_DIR, 'utils/fdfs/client.conf'))
        client = Fdfs_client(self.client_conf)

        # 获取上传文件内容
        file_content = content.read()

        # 上传文件
        # {
        #     'Group name': group_name,
        #     'Remote file_id': remote_file_id, # 保存的文件id
        #     'Status': 'Upload successed.', # 上传是否成功
        #     'Local file name': '',
        #     'Uploaded size': upload_size,
        #     'Storage IP': storage_ip
        # } if success else None

        response = client.upload_by_buffer(file_content)

        if response is None or response.get('Status') != 'Upload successed.':
            # 上传失败
            raise Exception('上传文件到fast dfs系统失败')

        # 获取保存文件id
        file_id = response.get('Remote file_id')

        # 返回file_id
        return file_id
Beispiel #6
0
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        sku = instance.sku
        image_url = instance.image.name
        try:
            # 删除文件
            client = Fdfs_client(settings.FDFS_CLIENT_CONF)
            client.delete_file(image_url)
        except:
            pass
        with transaction.atomic():
            sid = transaction.savepoint()
            try:
                instance.delete()
                # 如果删除的图片,是sku的默认图片
                if sku.default_image.name == image_url:
                    # 查询sku的所有图片
                    images = sku.images.all()
                    if images:
                        # 将第一个作为默认图片
                        sku.default_image = images[0].image
                    else:
                        sku.default_image = None
                    sku.save()
            except Exception as e:
                transaction.savepoint_rollback(sid)
                raise serializers.ValidationError('图片删除失败')
                # raise e
            else:
                transaction.savepoint_commit(sid)

                generate_detail_html.delay(sku.id)

                return Response(status=204)
Beispiel #7
0
    def _save(self, name, content):
        """
        保存文件
        :param name: 选择上传文件的文件名
        :param content: 包含上传文件内容的File对象
        :return: 上传文件后fast dfs 文件存储系统返回的文件ID
        """
        # 1. 创建 Fdfs_client对象
        # client = Fdfs_client('./utils/fdfs/client.conf')
        client = Fdfs_client(self.client_conf)

        # 2. 通过文件内容上传文件
        res = client.upload_by_buffer(content.read())

        # client.upload_by_buffer()方法返回内容
        # 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

        # 3. 判断上传是否成功,若上传失败抛出异常
        if res.get('Status') != 'Upload successed.':
            raise Exception('文件上传到 fast dfs 失败!')

        # 4. 上传成功获取返回的ID,并作为函数的返回值
        filename = res.get('Remote file_id')

        return filename
Beispiel #8
0
    def _save(self, name, content):
        """上传的时候会被调用的方法"""
        # name: test.jpg
        # content: 图片内容的file对象

        # 创建一个fastfds对象
        client = Fdfs_client(self.client_conf)

        # 上传文件到fast dfs系统中
        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,注意id并不是文件名,没带jpg的格式
        filename = res.get('Remote file_id')

        return filename
Beispiel #9
0
    def _save(self, name, content):
        """保存文件时使用"""
        # name:你选择上传文件的名字
        # content:包含你上传文件内容的File对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        # 上传文件到FastDFS系统中
        res = client.upload_appender_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('上传文件到FastDFS失败')

        # 获取返回的文件id
        filename = res.get('Remote file_id')

        return filename
Beispiel #10
0
    def _save(self, name, content):
        """保存文件时使用"""
        # name:你选择的上传文件的名字
        # content:包含你上传文件内容的file对象
        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        # 上传文件到fast dfs系统中
        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
        #  }
        # print(res.get('Status'))

        if res.get('Status') != 'Upload successed.':
            raise Exception('上传文件失败')

        # # 获取上传文件成功后的id名
        res_id = res.get('Remote file_id')

        return res_id
Beispiel #11
0
    def _save(self, name, content):
        #保存文件使用,name:选择的上传文件的名字
        #content:包含你上传文件内容的File对象

        #创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)
        #上传文件到系统中
        res = client.upload_by_buffer(content.read())

        # Ctrl+鼠标左击,可点击Fdfs_client去底层看返回值
        # @ return 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 success else None

        if res.get('Status') != 'Upload successed.':
            #上传失败
            raise Exception("上传文件到FastDFS失败")
        #获取返回的文件ID
        filename = res.get('Remote file_id')
        return filename
Beispiel #12
0
    def update(self, instance, validated_data):

        image = validated_data.get('logo')
        name = validated_data.get('name')
        first_letter = validated_data.get('first_letter')

        from fdfs_client.client import Fdfs_client
        client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')
        result = client.upload_by_buffer(image.read())

        if result['Status'] == 'Upload successed.':
            image_url = result.get('Remote file_id')

            # windows系统需要用此方法修改image_url,将group1\\M00/00/02/...改为group1/M00/00/02/...
            image_url = image_url.replace('\\', '/')

            instance.logo = image_url
            instance.name = name
            instance.first_letter = first_letter

            instance.save()

            return instance
        else:
            raise serializers.ValidationError('更新失败')
Beispiel #13
0
    def create(self, validated_data):

        image = validated_data.get('logo')
        name = validated_data.get('name')
        first_letter = validated_data.get('first_letter')

        from fdfs_client.client import Fdfs_client
        # 创建fastdfs连接对象
        client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')

        result = client.upload_by_buffer(image.read())

        if result['Status'] == 'Upload successed.':
            # 获取上传后的路径
            image_url = result.get('Remote file_id')

            # windows系统需要用此方法修改image_url,将group1\\M00/00/02/...改为group1/M00/00/02/...
            image_url = image_url.replace('\\', '/')

            # 保存图片
            brand = Brand.objects.create(name=name, logo=image_url, first_letter=first_letter)

            return brand
        else:
            raise serializers.ValidationError('上传失败')
Beispiel #14
0
    def _save(self, name, content):
        '''保存文件时使用'''
        # name:你选择上传文件的名字 test.jpg
        # content:包含你上传文件内容的File对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        # 上传文件到fast dfs系统中
        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')

        return filename
Beispiel #15
0
    def _save(self, name, content):
        '''保存文件时使用'''
        # name:你选择上传文件的名字
        # content:包含你上传文件内容的File对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        # 上传文件到fast dfs系统中
        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 = filename.decode(
            "utf-8"
        )  # 需要加上这一句,不然虽然可以存储到fastdfs,但无法存储到Django中的mysql,原因是返回值为b"string",需要转变成string

        return filename
Beispiel #16
0
    def _save(self, name, content):
        '''保存文件时使用'''
        # name :你选择上传文件的名字
        # content: 包含你上传文件内容的File类的对象

        # 创建一个Fdfs_client的对象,括号内就是这个客户端的配置文件
        client = Fdfs_client(self.client_conf)

        # 上传文件到fastdfs 文件存储系统中,并返回一个字典
        res = 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 res.get('Status') != 'Upload successed.':
            # 如果上传失败那么就抛出一个异常
            raise Exception('上传文件失败')

        # 上传成功,获取file_id
        file_id = res.get('Remote file_id')

        # 返回file_id
        return file_id
Beispiel #17
0
    def _save(self, name, content):
        """存储文件时使用"""
        # name :上传文件名
        # content: 包含上传文件内容的File对象-----读取文件内容

        # 创建一个Fast dfs 对象
        client = Fdfs_client('./utils/fdfs/client.conf')

        # 上传文件到Fast dfs系统中
        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('上传文件到fast dfs 失败')

        # 获取fast dfs存储的文件名
        filename = res.get('Remote file_id')

        return filename  # fast dfs 访问的url
Beispiel #18
0
    def _save(self, name, content):
        """保存文件时使用"""
        # name: 上传文件的名字
        # content: 包含需要上传文件的File类的一个对象

        # 创建一个Fdfs_client对象, 程序通过client.conf文件去找FastDFS的tracker server
        client = Fdfs_client(self.client_conf)
        # linux中pip install py3Fdfs 后, 网上说使用这种方式创建Fdfs_client对象
        # tracker_path = get_tracker_conf(self.client_conf)
        # client = Fdfs_client(tracker_path)

        # 上传文件到FastDFS系统中
        res = client.upload_by_buffer(content.read())
        # res
        # {
        #     '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('上传文件到FastDFS失败')

        # 获取返回的文件id
        filename = res.get('Remote file_id')

        return filename
Beispiel #19
0
 def save(self, name, content, max_length=None):
     # content:请求报文中的文件对象
     client = Fdfs_client(settings.FDFS_CLIENT_CONF)
     ret = client.upload_by_buffer(content.read())
     if ret['Status'] != 'Upload successed.':
         raise Exception('文件保存失败')
     return ret['Remote file_id']
Beispiel #20
0
    def _save(self, name, content):
        '''
        保存文件时使用
        :param name:选择上传的文件名字
        :param content: 包含上传文件内容的File对象
        :return:
        '''
        #创建一个fdfs_client对象
        client = Fdfs_client('./utils/fdfs/client.conf')

        #上传文件到fast_dfs系统中;
        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 success else None
        #如果上传失败提示错误信息
        if res.get('Status') != 'Upload successed.':
            #上传失败
            raise Exception('上传文件到fast dfs失败')
        #获取返回的文件ID
        filename = res.get('Remote file_id')

        return filename
    def image(self, request):
        """
            保存图片
        :param request:
        :return:
        """
        # 1、获取图片数据
        data = request.FILES.get('image')
        # 验证图片数据
        if data is None:
            return Response(status=500)

        # 2、建立fastDFS连接对象
        client = Fdfs_client(settings.FASTDFS_CONF)

        # 3、上传图片
        res = client.upload_by_buffer(data.read())

        # 4、判断上传状态
        if res['Status'] != 'Upload successed.':
            return Response({'error': '上传失败'}, status=501)

        # 5、获取上传的图片路径
        image_url = res['Remote file_id']

        # 6、结果返回
        return Response({'img_url': settings.FDFS_URL + image_url}, status=201)
Beispiel #22
0
    def update(self, instance, validated_data):
        # 1、获取前端brand对象
        brand = validated_data.get('name')
        first_letter = validated_data.get('first_letter')
        # 2、获取前端传递的图片数据
        logo = validated_data['logo']
        # 3、链接fasfDFS
        client = Fdfs_client(
            '/home/python/Desktop/Git_meiduo/meiduo_mall/utils/fastdfs/client.conf'
        )
        # 4、上传图片
        res = client.upload_by_buffer(logo.read())
        # 5、判断是否成功
        if res['Status'] != 'Upload successed.':
            raise serializers.ValidationError('上传失败')
        # 6、提取图片链接地址
        path = res.get('Remote file_id')

        # 7、保存图片表
        instance.logo = path

        # 更新图片
        instance.save()
        # 生成静态化页面
        # get_detail_html(sku.id)

        # 异步处理调用
        # get_detail_html.delay(name)
        return instance
Beispiel #23
0
    def _save(self, name, content):
        """保存文件时使用
        # name: 保存文件名字
        # content: 包含上  传文件内容的File对象"""
        client = Fdfs_client(self.client_conf)

        # 上传文件到fastdfs系统中
        res = client.upload_by_buffer(content.read())

        # res 返回 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('上传文件到FastDFS失败')

        # 获取返回的文件ID
        filename = res.get('Remote file_id')

        return filename
Beispiel #24
0
    def _save(self, name, content):
        '''保存文件时使用'''
        # name:你选择上传文件的名字
        # content:包含你上传文件内容的File对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)
        ext_file = name.split('.')[-1]
        # 上传文件到fast dfs系统中
        res = client.upload_by_buffer(content.read(),file_ext_name=ext_file)

        # 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')

        return filename
Beispiel #25
0
    def _save(self, name, content):
        '''保存文件时使用 上传到fast_fds'''
        # name:你选择上传文件的名字
        # content:包含你上传文件内容的File对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        # 上传文件到fast_dfs系统中
        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')

        return filename
Beispiel #26
0
    def _save(self, name, content):
        """用于保存文件"""
        # 创建一个fdfs client连接对象
        client = Fdfs_client(self.base_conf)

        # content 返回一个file对象
        file_content = content.read()

        # 根据文件内容上传文件
        # {
        #     'Group name': group_name,
        #     'Remote file_id': remote_file_id,
        #     'Status': 'Upload successed.',
        #     'Local file name': '',
        #     'Uploaded size': upload_size,
        #     'Storage IP': storage_ip
        # }
        res = client.upload_by_buffer(file_content)

        if res.get('Status') != 'Upload successed.':
            # 上传失败
            raise Exception('上传文件到fdfs失败')

        # 获取返回的文件id
        filename = res.get('Remote file_id')

        return filename
Beispiel #27
0
    def _save(self, name, content):
        '''保存文件时使用'''
        # name:你选择上传文件的名字
        # content:包含你上传文件内容的File对象

        # 创建一个Fdfs_client对象
        tracker_path = get_tracker_conf(self.client_conf)
        client = Fdfs_client(tracker_path)

        # 上传文件到fast dfs系统中
        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')

        return filename.decode("utf-8")
Beispiel #28
0
    def _save(self, name, content):
        '''保存文件时使用'''
        # name:你选择上传文件的名字
        # content:包含上传文件时的File对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        # 上传文件到Fast  dfs系统中
        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('文件上传失败')

        # 在image表中保存/group1/...  内容,返回的Remote file_id是这部分类容
        # 获取返回的文件id
        filename = res.get('Remote file_id')

        return filename
Beispiel #29
0
    def _save(self, name, content):
        """保存文件时使用"""
        #name:你选择上传文件的名字
        #content:包含你上传文件内容的file对象 获取文件的内容

        #创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        #上传文件到fast dfs系统中
        res = client.upload_by_buffer(
            content.read())  #upload_by_buffer:根据内容上传文件  返回一个字典
        #res格式
        # 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')

        return filename
Beispiel #30
0
    def _save(self, name, content):
        '''保存文件时使用'''
        # name:你选择上传文件的名字
        # content:包含你上传文件内容的File对象

        # 创建一个对象
        tracker = get_tracker_conf(self.client_conf)
        client = Fdfs_client(tracker)
        # print('->>>', client)
        # 上传到fast dfs系统中
        res = client.upload_by_buffer(content.read())

        # @return 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 success else None
        if res.get('Status') != 'Upload successed.':
            # 上传失败
            raise Exception('上传文件到FastDFS失败')
        print(res)
        # 获取返回的文件id
        filename = res.get('Remote file_id')
        return filename.decode()