flask 上传和下载文件
自动创建文件存储目录
def get_file_dir(self, obj_id):
try:
target_father_dir = os.path.join(app.config['UPLOAD_DIR'], "xxxx")
if not os.path.exists(target_father_dir):
os.makedirs(target_father_dir)
target_dir = os.path.join(target_father_dir, obj_id)
if not os.path.exists(target_dir):
os.makedirs(target_dir)
return target_dir
except: # 若失败,极可能是因为服务器上的用户权限问题
return self.render_json(code=Code.failed, message='创建文件存储目录失败')
上传文件
def upload_file(self, params=None):
f = request.files.get('file')
file_name = f.filename
file_ext = f.filename.split('.')[-1].lower()
file_type = f.content_type
json_data = outputParamValues()
# 类型限制
if file_ext not in ["jpg", "jpeg", "png", "pdf", "ppt", "docx", "doc", "msg"]:
return self.render_json(code=Code.failed, message='上传文件的类型限制为: jpg、jpeg、png、pdf、ppt、word、msg')
obj_id = json_data.get('obj_id')
if 根据obj_id查询数据库:
return self.render_json(code=Code.failed, message='无xxx对象')
try:
# 存储文件
target_dir = self.get_file_dir(obj_id)
f.save(target_dir + "/" + file_name)
# 验证是否存储成功
if not os.path.exists(target_dir + "/" + file_name):
return self.render_json(code=Code.failed, message='存储文件失败')
# 返回数据
data = {'obj_id': obj_id, 'data': {'file_name': file_name,
'target_dir': target_dir,
'path': target_dir + "/" + file_name,
'file_type': file_type}} # file_type 前端以后下载时会起作用
return self.render_json(code=Code.Ok, message='存储文件成功', data=data)
except:
return self.render_json(code=Code.failed, message='存储文件失败')
下载文件
def download_file(self, params=None):
# flask框架提供了 send_from_directory 方法,只需要提供补充其中的参数即可
return send_from_directory(target_dir, file_name, attachment_filename=file_name, as_attachment=True)