定义上传文件的模板页面 upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>文件上传</title>
<style type="text/css">
.div1 {
height: 180px;
width: 380px;
border: 1px solid #8a8989;
margin: 0 auto;
}
.input {
display: block;
width: 250px;
height: 30px;
margin: 10px auto;
}
.button {
background: #2066c5;
color: white;
font-size: 18px;
font-weight: bold;
height: 30px;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="div1">
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file" class="input" />
<input type="submit" value="上传" class="input button" />
</form>
</div>
</body>
</html>
# -*- coding:utf-8 -*-
from wtforms import Form, FileField
from flask_wtf.file import FileRequired, FileAllowed
class UploadForm(Form):
file = FileField(validators=[
FileRequired(), # FileRequired必须上传
FileAllowed(['jpg', 'png', 'gif']) # FileAllowed:必须为指定的格式的文件
])
定义主程序
from flask import Flask, render_template, request, send_from_directory
import time
import os
from os import path
from werkzeug.utils import secure_filename
import platform
from form import UploadForm
from werkzeug.datastructures import CombinedMultiDict
app = Flask(__name__)
# 判断不同系统下使用不同的文件分隔符
if platform.system() == "Windows":
slash = '\\'
else:
platform.system() == "Linux"
slash = '/'
# 文件存储路径 = 根目录 + 分隔符 + 'uploads' + 分隔符
UPLOAD_PATH = os.path.curdir + slash + 'uploads' + slash
@app.route('/', methods=['POST', 'GET'])
def hello_world(): # 如果收到 GET 请求则跳转到上传文件界面
if request.method == 'GET':
return render_template('upload.html')
else: # 如果收到 POST 请求则返回响应
if not os.path.exists(UPLOAD_PATH): # 没有目录则创建目录
os.makedirs(UPLOAD_PATH)
# 将表单和文件一起实例化
form = UploadForm(CombinedMultiDict([request.form, request.files]))
if form.validate():
f = request.files['file']
filename = secure_filename(f.filename) # 取得文件名字
ext = filename.rsplit('.', 1)[1] # 获取文件后缀
unix_time = int(time.time()) # 获取上传文件时的时间戳
new_filename = str(unix_time) + '.' + ext # 对文件进行重新命名
file_url = UPLOAD_PATH + new_filename
print(new_filename) # 输出新文件名
print(UPLOAD_PATH) # 输出文件夹路径
print(file_url) # 输出文件路径
f.save(path.join(UPLOAD_PATH, new_filename)) # 保存文件
return "上传文件成功!!"
else:
return "只支持jpg、png以及gif格式的文件!"
# 访问上传的文件
# 浏览器访问:http://127.0.0.1:5000/images/xxx.jpg/ 就可以查看文件了
@app.route('/images/<filename>/', methods=['GET', 'POST'])
def get_image(filename):
dirpath = os.path.join(
app.root_path, 'uploads') # 得到文件路径
print(dirpath)
print(filename)
# 也可以为下载方式: return send_from_directory(dirpath,filename,as_attachment=True)
return send_from_directory(dirpath, filename) # 为在线浏览方式
if __name__ == '__main__':
app.run(debug=True)
参考资料
https://weread.qq.com/web/reader/0a932660718ac6bc0a9702e