前言:本文是学习网易微专业的《python全栈工程师 - Flask高级建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!
一、课程目标
- 文件数据接收
- 文件格式与大小限制
- 文件名生成规则
二、详情解读
2.1.表单设置
前端表单设置:
<form method="post" enctype="multipart/form-data">
enctype
:规定在发送到服务器之前应该如何对表单数据进行编码。
默认值:"application/x-www-form-urlencoded"
。
上传设定:"multipart/form-data"
- 表示多种编码数据。
2.1.1.文件上传域
<input type="file" name="file" accept="image/gif, image/jpeg" multiple="multiple">
accept
:允许上传的文件格式,比如:"image/gif, image/jpeg"
multiple
:允许一次上传多张图片
实操:
Step1
:创建文件templates/upload/form_upload.html
,写入以下代码:
{% extends 'base.html' %}
{% block content %}
<form action="" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="picname">图片名称</label>
<input type="text" name="picname" class="form-control">
</div>
<div class="form-group">
<input type="file" name="file" class="form-control" accept="image/gif">
<input type="submit" name="submit" value="上传" class="btn btn-primary">
</div>
</form>
{% endblock %}
Step2
:创建文件views/upload.py
,写入以下代码:
# -*- coding=utf-8 -*-
from flask import Blueprint, request, render_template
upload_app = Blueprint('upload', __name__)
#上传文件
@upload_app.route('/', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
pass
return render_template('upload/form_upload.html')
Step3
:将Step2
中的upload_app
注册到app.py
文件中
.
.
.
from views.users import user_app
from views.articles import article_app
from views.upload import upload_app # 新增这一行
from flask_migrate import Migrate
.
.
.
app.register_blueprint(user_app, url_prefix="/user")
app.register_blueprint(article_app, url_prefix="/article")
app.register_blueprint(upload_app, url_prefix="/upload") # 新增这一行
.
.
.
2.2.后台数据接收
2.2.1.request.files对象
通过form
表单上传的文件数据,在flask
内可以通过request.files
对象获取到:
单个文件:
file_storage = request.files.get('文件域name')
返回的file_storage
是FileStorage
对象实例。
FileStorage
对象实例就是表单上传的文件
实例属性与方法 | 说明 |
---|---|
content_type | 文件类型 |
filename | 上传的文件名 |
name | 文件域名 |
save(file_path) | 将上传的文件保存到file_path |
实操1: 上传单个文件
替换views/upload.py
内容为以下代码,同时新建目录static/uploads
:
#上传文件
@upload_app.route('/', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
file_storage = request.files.get('file')
# 上传类型
print(file_storage.content_type)
# 上传文件原名
print(file_storage.filename)
# 文件域名
print(file_storage.name)
# 使用原名直接保存
file_storage.save("./static/uploads/" + file_storage.filename)
return render_template('upload/form_upload.html')
实操2: 上传多个文件
Step1
:修改文件templates/upload/form_upload.html
:
.
.
.
<div class="form-group">
<!-- 添加 multiple="multiple" 属性 -->
<input type="file" name="file" class="form-control" accept