flask上传文件以及常见问题
一、flask文档上传文件的介绍
Flask上传文件的文档介绍,文件上传的基本思想实际上非常简单。它基本上是这样工作的:
-
1、一个
<form>
标签用enctype = multipart / form-data
标记,<input type = file>
放在那个表格中。 -
2、应用程序从请求对象上的:attr:
~flask.request.files
字典访问该文件。 -
3、使用 save() 方法将文件永久保存在文件系统的某个位置。
切记1:在将文件直接存储到文件系统之前,一定要使用secure_filename()
函数来保护文件名。
切记2:一定要限制上传文件的扩展
二、上传文件的实现
2.1、生成一个from表单,用来提交图片
在同级别下的templates
目录下,新建一个upload.html
文件,代码如下:
c
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>头像:</td>
<td><input type="file" name="file"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
2.2、编写上传的逻辑
在upload.py文件中,编写上传的逻辑,代码如下:
from flask import Flask, render_template, request, send_from_directory
from werkzeug.utils import secure_filename
import os
import uuid
app = Flask(__name__)
# 设置文件上传保存路径
app.config['UPLOAD_FOLDER'] = 'static/uploads/'
# MAX_CONTENT_LENGTH设置上传文件的大小,单位字节
app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024
@app.route('/', methods = ['GET'])
def hell():
return '翻倍阿'
@app.route('/upload', methods=['GET', 'POST'])
def upload():
# 如果是get请求响应上传视图,post请求响应上传文件
if(request.method == 'GET'):
return render_template('upload.html')
else:
if 'file' not in request.files:
return 'No file part'
file = request.files['file']
if file.filename == '':
return 'No selected file'
fname = secure_filename(file.filename)
ext = fname.rsplit('.')[-1]
# # 生成一个uuid作为文件名
fileName = str(uuid.uuid4()) + "." + ext
# return fileName
# # os.path.join拼接地址,上传地址,f.filename获取文件名
static_upload_path = app.config['UPLOAD_FOLDER']
if not os.path.exists(static_upload_path):
os.makedirs(static_upload_path)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], fileName))
return 'ok'
# 图片下载
@app.route('/download/<filename>', methods=['GET'])
def download(filename):
if request.method == "GET":
#通过文件名下载文件
# return os.path.join(app.config['UPLOAD_FOLDER'], filename)
path = os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], filename))
# return {
# 'is_file' :path
# }
if path:
return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)
if __name__ == '__main__':
app.run(debug=True)
要是想限制上传文件的类型,可以参考文档上的:
三、运行代码、以及常见异常
运行以后,是这样的:
若是选中文件提交以后,出现异常
这里需要确保保存文件的目录真实存在,且有权限,所以为了避免该问题,最好在代码中判断一下目录是否存在
if not os.path.exists(static_upload_path):
os.makedirs(static_upload_path)
四、写在最后
宣传一波:大家若是有人想北京租房可以联系我,主要是物资学院、通州北关、北苑、草房的房子。(注:我不是中介哟,我也不打算转行做中介,是我靠谱的朋友在做)