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 _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): '''保存文件时使用 上传到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): """保存文件时使用""" # 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 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 _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) # 上传文件到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, 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): '''保存文件时使用''' # 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) 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): '''保存文件时使用''' # 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()
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(self.client_conf) # 获取上传文件的内容 content = content.read() # 上传文件到FDFS文件存储服务器 # upload_by_buffer:根据文件的内容将文件上传到FDFS系统 # { # '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(content) if response is None or response.get('Status') != 'Upload successed.': # 上传失败,抛出异常 raise Exception("上传文件到FDFS系统失败") # 获取文件ID file_id = response.get('Remote file_id') # 返回文件ID return file_id
def _save(self, name, content): """ 保存文件时使用 :param name: 上传文件的名字 :param content: 包含上传文件内容的File对象 """ client = Fdfs_client(self.client_conf) # 上传文件到fastdfs系统 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('上传文件到fastdfs失败') # 获取返回的文件id filename = res.get('Remote file_id') return filename
def _save(self, name, content): # name是图片的原始名字,content是传过来的图片对象 # 生成fdfs对象,用来访问fdfs服务器 client = Fdfs_client(self.client_conf) # 读取图片文件 file_data = content.read() # 上传图片到fastdfs try: # 上传图片需要访问fdfs服务,是远程链接,也有可能出现异常 ret = client.upload_by_buffer(file_data) except Exception as e: print(e) raise """ ret返回下面这种类型的值 { 'Group name': 'group1', 'Status': 'Upload successed.', # 注意这有一个点 'Remote file_id': 'group1/M00/00/00/wKjzh0_xaR63RExnAAAaDqbNk5E1398.py', 'Uploaded size': '6.0KB', 'Local file name': 'test', 'Storage IP': '192.168.243.133' } """ # 判断是否上传成功,获取文件的存放的真是路径和名字 if ret.get('Status') == 'Upload successed.': file_id = ret.get('Remote file_id') return file_id else: # 抛出异常 raise Exception('上传图片到fdfs失败')
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 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): ''' :param name:你选择的上传文件的名字 :param content:File类的对象,包含你上传的文件内容,有了这个对象就可以获取文件内容 :return: ''' # 创建一个fdfs_client对象 client = Fdfs_client(self.client_conf) # 上传文件到fastdfs系统中 # upload_by_buffer()方法是根据文件内容上传文件,回值格式为: #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 # } res = client.upload_by_buffer(content.read()) print(res) #判断是否上传成功 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 _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对象 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) # 上传文件到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) #上传文件到系统中 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 _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, 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 :你选择上传文件的名字 # 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: 上传文件的名称 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 _save(self, name, content): """保存文件的时候使用""" # name :上传文件的名称 # content: 包含上传文件内容的File对象 # { # 'Group name': group_name, # 'Remote file_id': remote_file_id, # 'Status': 'Upload successed.', # 'Local file name': '', # 'Uploaded size': upload_size, # 'Storage IP': storage_ip # } # 上传文件到fdfs系统中 client = Fdfs_client(self.client_conf) # 获取上传文件的内容 content = content.read() # 调用upload_by_buffer() res = client.upload_by_buffer(content) # 判断是否上传成功 if res['Status'] != 'Upload successed.': raise Exception('上传文件到fdfs失败') # 获取文件的id file_id= res['Remote file_id'] # 返回文件的id return file_id
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 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, max_length=None): '''重写上传文件的函数''' # 我们需要将文件上传到 FastDFS 上面. # 创建客户端对象: client = Fdfs_client(settings.FDFS_CLIENT_CONF) # 调用上传函数, 进行上传: # 我们这里调用的是上面说过的, 根据文件内容上传方法. result = client.upload_by_buffer(content.read()) # 判断是否上传成功: if result.get('Status') != 'Upload successed.': raise Exception('上传文件到FDFS系统失败') # 上传成功: 返回 file_id: file_id = result.get('Remote file_id') # 这个位置返回以后, django 自动会给我们保存到表字段里. return file_id
def _save(self, name, content): """保存 context是用户上传过来的文件对象""" # 从文件对象中读取文件数据 file_data = content.read() # 创建用户存储fastdfs的客户端 client = Fdfs_client(self.client_conf) # 上传文件内容到fastdfs中 try: ret = client.upload_by_buffer(file_data) # ret的返回值格式 {'Group name':'group1','Status':'Upload successed.', 'Remote file_id':'group1/M00/00/00/ # wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test' # , 'Storage IP':'192.168.243.133'} except Exception as e: print(e) raise if ret.get("Status") == "Upload successed.": # 表示上传成功 file_id = ret.get("Remote file_id") # 返回file_id, 也就是文件名,django会保存到数据库中 return file_id else: raise Exception("上传到FastDFS失败")
class FilesrvHandler(object): def __init__(self): self.secret_code = "sW$^dffGad3e3h8fh7gc~t7 `7 t" self.root = "/data0/androidapk/" self.client = Fdfs_client('/etc/fdfs/client.conf') def test(self, words): return words def save(self, fileobj, meta): try: result = {} hexs = sha1(meta.appid) #hexs.update(str(meta.version_code)) hexs.update(self.secret_code) hexs.update(str(meta.seq)) hex_code = hexs.hexdigest() dirs = os.path.join(meta.file_type, *[hex_code[(i-1)*2:i*2] for i in range(1, 5)]) filename = "{}.{}".format(hex_code[8:], meta.ext) filepath = os.path.join(dirs, filename) fullpath = os.path.join(self.root, filepath) try: os.makedirs(os.path.join(self.root, dirs)) except: pass with open(fullpath, 'w') as f: f.write(fileobj) result["md5"] = md5(fileobj).hexdigest() result["path"] = filepath except Exception as e: result = {"error": str(e)} return json.dumps(result) def save2fdfs(self, filebuff, meta): meta_dict = { "appid": meta.appid, "version_code": meta.version_code, "version_name": meta.version_name, "file_type": meta.file_type, "ext": meta.ext, "seq": meta.seq } rs = self.client.upload_by_buffer(filebuff, meta.ext, meta_dict=meta_dict) result = { "md5": md5(filebuff).hexdigest(), "path": rs["Remote file_id"], "size": rs["Uploaded size"] } return json.dumps(result) def save_media2fdfs(self, filebuff, ext): rs = self.client.upload_by_buffer(filebuff, ext) result = { "md5": md5(filebuff).hexdigest(), "path": rs["Remote file_id"], "size": rs["Uploaded size"] } return json.dumps(result) def get(self, fileid): try: meta = self.client.get_meta_data(fileid) return Meta( appid=meta['appid'], version_code=int(meta['version_code']), version_name=meta['version_name'], file_type=meta['file_type'], ext=meta['ext'], seq=int(meta['seq']) ) except Exception as e: return str(e) def remove(self, fileid): os.remove(os.path.join(self.root, fileid)) return json.dumps({'appid': fileid})