代码逻辑由app.py决定,具体功能见我加上的注释:
app.py
#!flask/bin/python
# Author: Ngo Duy Khanh
# Email: [email protected]
# Git repository: https://github.com/ngoduykhanh/flask-file-uploader
# This work based on jQuery-File-Upload which can be found at https://github.com/blueimp/jQuery-File-Upload/
import os
import PIL
from PIL import Image
import simplejson
import traceback
from flask import Flask, request, render_template, redirect, url_for, send_from_directory
from flask_bootstrap import Bootstrap
from werkzeug.utils import secure_filename
from lib.upload_file import uploadfile
app = Flask(__name__) # 使用flask框架,绑定
app.config['SECRET_KEY'] = 'hard to guess string' # 设置秘钥,路径,最大图片大小等等
app.config['UPLOAD_FOLDER'] = 'data/'
app.config['THUMBNAIL_FOLDER'] = 'data/thumbnail/'
app.config['MAX_CONTENT_LENGTH'] = 50 * 1024 * 1024
ALLOWED_EXTENSIONS = set(['txt', 'gif', 'png', 'jpg', 'jpeg', 'bmp', 'rar', 'zip', '7zip', 'doc', 'docx'])
IGNORED_FILES = set(['.gitignore'])
bootstrap = Bootstrap(app)
'''
检查类型
'''
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS # 检查类型是否包含在列表里
'''
针对重名情况进行处理
'''
def gen_file_name(filename):
"""
If file was exist already, rename it and return a new name
"""
i = 1
while os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], filename)):
name, extension = os.path.splitext(filename)
filename = '%s_%s%s' % (name, str(i), extension)
i += 1
return filename
'''
建立缩略图
'''
def create_thumbnail(image):
try:
base_width = 80 # 宽度基线
img = Image.open(os.path.join(app.config['UPLOAD_FOLDER'], image)) # 载入图片
w_percent = (base_width / float(img.size[0])) # 宽度和像素比
h_size = int((float(img.size[1]) * float(w_percent))) # 等比缩放
img = img.resize((base_width, h_size), PIL.Image.ANTIALIAS) # 修改图片大小
img.save(os.path.join(app.config['THUMBNAIL_FOLDER'], image)) # 保存图片到本地
return True
except:
print(traceback.format_exc()) # 异常处理,打印栈路径
return False
# 访问路径修改为http://127.0.0.1:5000/upload 时调用upload
@app.route("/upload", methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
files = request.files['file']
if files:
filename = secure_filename(files.filename) # 防止黑客攻击,去除不安全的命名,安全命名
filename = gen_file_name(filename) # 生产新命名
mime_type = files.content_type # 保存媒体类型 图片:image/jpeg
if not allowed_file(files.filename):
result = uploadfile(name=filename, type=mime_type, size=0, not_allowed_msg="File type not allowed")
else:
# save file to disk
uploaded_file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) # 路径地址加上文件名称
files.save(uploaded_file_path) # 文件保存到上传路径
# create thumbnail after saving
if mime_type.startswith('image'):
create_thumbnail(filename) # 图片类型,创建缩略图
# get file size after saving
size = os.path.getsize(uploaded_file_path) # 保存后,读取本地文件获取文件大小
# return json for js call back
result = uploadfile(name=filename, type=mime_type, size=size) # 上传文件
print(uploadfile(name=filename, type=mime_type, size=size))
return simplejson.dumps({"files": [result.get_file()]})
if request.method == 'GET':
print("get")
# get all file in ./data directory
files = [f for f in os.listdir(app.config['UPLOAD_FOLDER']) if os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'],f)) and f not in IGNORED_FILES ]
file_display = []
for f in files:
size = os.path.getsize(os.path.join(app.config['UPLOAD_FOLDER'], f))
file_saved = uploadfile(name=f, size=size)
file_display.append(file_saved.get_file())
return simplejson.dumps({"files": file_display})
return redirect(url_for('index'))
@app.route("/delete/<string:filename>", methods=['DELETE'])
def delete(filename):
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file_thumb_path = os.path.join(app.config['THUMBNAIL_FOLDER'], filename)
if os.path.exists(file_path):
try:
os.remove(file_path)
if os.path.exists(file_thumb_path):
os.remove(file_thumb_path)
return simplejson.dumps({filename: 'True'})
except:
return simplejson.dumps({filename: 'False'})
# serve static files
@app.route("/thumbnail/<string:filename>", methods=['GET'])
def get_thumbnail(filename):
return send_from_directory(app.config['THUMBNAIL_FOLDER'], filename=filename)
@app.route("/data/<string:filename>", methods=['GET'])
def get_file(filename):
return send_from_directory(os.path.join(app.config['UPLOAD_FOLDER']), filename=filename)
@app.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True, port=9191)