文件上传
一、原生文件上传
(1) 前台模板表单
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h4>文件上传</h4>
<form action="" method="post" enctype="multipart/form-data">
<p>
文件上传:<input type="file" name="file">
</p>
<p>
<input type="submit" value="submit">
</p>
</form>
</body>
</html>
(2) 视图函数处理
代码如下:
from flask import Flask,render_template,request
from flask_script import Manager
import os
app = Flask(__name__)
# 上传文件保存路径
UPLOAD_FOLDER = os.path.join(os.getcwd(),'static/upload')
manager = Manager(app)
@app.route('/form1/',methods=['GET','POSt'])
def upload():
# 判断请求方式是否为post
if request.method == 'POST':
# 获取上传过来的文件对象
file = request.files.get('file')
# 获取文件名称
filename = file.filename
# 保存上传文件
file.save(os.path.join(UPLOAD_FOLDER,filename))
return '上传成功'
return render_template('form1.html')
if __name__ == '__main__':
manager.run()
注意:
如果获取不到上传的文件
- 表单的提交方式 是否为post
- form标签的enctype属性改为multipart/form-data
- 上传的字段类型为file 必须存在name属性
二、带限制条件的上传
(1) 模板代码
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h4>文件上传</h4>
{% if filename %}
<img src="{{ url_for('static',filename='upload/m_'+filename) }}" alt="">
{% endif %}
<form action="" method="post" enctype="multipart/form-data">
<p>
文件上传:<input type="file" name="file" required>
</p>
<p>
<input type="submit" value="submit">
</p>
</form>
</body>
</html>
(2) 视图函数代码
代码如下:
from flask import Flask,render_template,request
from flask_script import Manager
import os
# 安装pillow模块 pip install pillow
from PIL import Image
app = Flask(__name__)
# 允许文件上传的类型
ALLOWED_EXTENSIONS = ['jpg','jpeg','gif','png']
# 文件上传大小
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64
# 保存位置
UPLOAD_FOLDER = os.path.join(os.getcwd(),'static/upload')
manager = Manager(app)
"""
添加条件的限制
1.文件类型
2.文件大小
3.保存位置
4.生成唯一的文件名称
5.保存
6.缩放处理
7.前台模板显示
8.上传成功
"""
# 生成唯一图片名称的函数
def random_filename(suffix,length=64):
import string,random
Str = string.ascii_letters+string.digits
return ''.join(random.choice(Str) for i in range(length))+'.'+suffix
# 使用uuid扩展库生成唯一的名称
def random_filename2(suffix):
import uuid
u = uuid.uuid4()
return str(u)+'.'+suffix
@app.route('/form/',methods=['GET','POST'])
def upload():
new_filename = None
# 判断请求的方式 和是否有文件传递
if request.method == 'POST' and request.files.get('file'):
# 获取上传文件对象
file = request.files.get('file')
# 获取名称
filename = file.filename
# 获取后缀
suffix = filename.split('.')[-1]
# 判断后缀是否允许
if suffix not in ALLOWED_EXTENSIONS:
return '该类型不允许上传'
new_filename = random_filename(suffix)
# return new_filename
while True:
# 拼接文件名称和路径
path = os.path.join(UPLOAD_FOLDER, new_filename)
# 判断这个名字的文件是否存在
if not os.path.exists(path):
break
# 保存
file.save(path)
# 图片缩放处理
# 打开文件
img = Image.open(path)
# 重新设计尺寸
img.thumbnail((140,140))
# 保存缩放后的图片 保留原图片
# 保存缩放
img.save(os.path.join(UPLOAD_FOLDER, 'm_'+new_filename))
return render_template('form1.html',filename=new_filename)
if __name__ == '__main__':
manager.run()
三、flask-uploads扩展库文件上传
概述:
在文件上传时 提供了很大的方便 如:文件类型的过滤 校验
安装:
pip install flask-uploads
使用:
视图函数代码如下:
from flask import Flask,render_template,request
from flask_script import Manager
# 导入flask-uploads扩展库
from flask_uploads import IMAGES,UploadSet,configure_uploads,patch_request_class
import os
app = Flask(__name__)
# 上传文件大小
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64
# 配置保存的路径
app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(),'static/upload')
# 配置过滤类型
photos = UploadSet('photos',IMAGES)
# 和flask对象绑定
configure_uploads(app,photos)
# 配置上传大小的限定按照配置参数app.config['MAX_CONTENT_LENGTH']进行限定
patch_request_class(app,size=None)
manager = Manager(app)
@app.route('/form/',methods=['GET','POST'])
def form():
img_url = None
if request.method == 'POST' and request.files.get('file'):
# 保存文件
filename = photos.save(request.files.get('file'))
# 通过上传文件的名称获取路由地址
img_url = photos.url(filename)
return render_template('form1.html',img_url=img_url)
if __name__ == '__main__':
manager.run()
模板代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h4>文件上传</h4>
{% if img_url %}
<img src="{{ img_url }}" alt="">
{% endif %}
<form action="" method="post" enctype="multipart/form-data">
<p>
文件上传:<input type="file" name="file" required>
</p>
<p>
<input type="submit" value="submit">
</p>
</form>
</body>
</html>