这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
引言:文件上传的功能经常会在项目中被用到,今儿我们就来谈谈Flask中的文件上传功能如何实现。
文件上传的原理
- 一个
<form>标签标记有enctype=multipart/form-data,并且<input>的type=file。 - 服务端应用通过请求对象的files字典访问文件。
- 使用文件save()方法将文件永久的保存在文件系统上的某处。
小提示:
multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
后端逻辑
首先先在Flask对象的配置中定义默认的上传文件夹的路径和上传文件的最大大小。
app.config['UPLOAD_FOLDER']:定义上传文件夹的路径
app.config['MAX_CONTENT_LENGTH']:上传文件的最大大小(以字节为单位。)
设置如下:
app.config['UPLOAD_FOLDER'] = 'static/images'
app.config['MAX_CONTENT_LENGTH'] = 4*1024*1024
设置好了后,接下来就是实现相应的接口,其中我们需要一个访问的页面,页面中需要有两个按钮,一个用于上传文件,一个用于提交。具体获取文件的流程最开始有提到。这边再稍微说明以下:flask中request的files对象(该对象为一个字典)用于保存file文件,可以通过其来获得相应的文件,并将其保存到具体的路径下面,具体代码如下:
comc = Blueprint('commic', __name__) #蓝图
@comc.route('/upload',methods=['GET','POST'])
def upload():
if request.method == 'POST':
img = request.files['file'] #获得文件
print(request.files)
try:
img.save(os.path.join(comc_app.config['UPLOAD_FOLDER'],secure_filename(img.filename))) # 保存文件到指定路径
except:
return render_template('/admin/upload.html',notice='文件上传失败!')
return render_template('/admin/upload.html',notice='文件上传成功!')
else:
return render_template('/admin/upload.html')
前端逻辑
前端页面的话相对于后端页面要简单一些,具体就是前端传文件数据,而每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。这里我简单给一个模板:
上传成功:
因为设置了文件最大大小所以如果超过最大大小,页面就会报错: