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')
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
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
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']
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
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)
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
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
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
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
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
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('更新失败')
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('上传失败')
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
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
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
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
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
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']
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)
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
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
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
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
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
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")
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
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
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()