flask实现文件的上传与访问
- 在前台的模版中,form表单里面需要指定
encotype='multipart/form-data'
。然后通过<input type="file" name="photo" />
来选择文件。 - 后台获取上传的文件,可以使用
request.files.get('photo')
来获取。 - 保存文件之前,先要使用
werkzeug.utils.secure_filename
来对上传上来的文件名进行一个过滤。这样才能保证不会有安全问题。 - 获取到上传上来的文件后,使用
photo.save(路径)
方法来保存文件。、 - 从服务器上读取文件,应该定义一个url与视图函数,来获取指定的文件。在这个视图函数中,使用
send_from_directory(文件的目录,文件名)
来获取。 可以通过
send_from_directory(UPLOAD_PATH,filename)
,来访问上穿的文件,第一个参数为路径,第二个参数为文件名。
示例代码如下:UPLOAD_PATH = os.path.join(os.path.dirname(__file__),'images') @app.route('/upload/',methods=['GET','POST']) def upload(): # 获取描述信息 photo = request.files.get("photo") filename = secure_filename(photo.filename) photo.save(os.path.join(UPLOAD_PATH,filename)) print(desc) return '文件上传成功' @app.route('/images/<filename>/') def get_image(filename): return send_from_directory(UPLOAD_PATH,filename)
注意:对上传文件使用表单验证:
- 定义表单的时候,对文件的字段,需要采用
FileField
这个类型。 - 验证器应该从
flask_wtf.file
中导入。flask_wtf.file.FileRequired
是用来验证文件上传是否为空。flask_wtf.file.FileAllowed
用来验证上传的文件的后缀名。 在视图文件中,使用
from werkzeug.datastructures import CombinedMultiDict
来把request.form
与request.files
来进行合并。再传给表单来验证。
示例代码如下:from werkzeug.datastructures import CombinedMultiDict form = UploadForm(CombinedMultiDict([request.form,request.files]))