一、Flask上传文件
1、一个 <form> 标签被标记有 enctype=multipart/form-data ,并且在里面包含一个 <input type=file> 标签。
2、服务端应用通过请求对象上的 files 字典访问文件。
3、使用文件的 save() 方法将文件永久地保存在文件系统上的某处。
UPLOAD_FOLDER 是我们储存上传的文件的地方,而 ALLOWED_EXTENSIONS 则是允许的文件类型的集合。然后我们手动为应用添加一个的 URL 规则。我们通常很少这样做,但是为什么这里要如此呢?原因是我们希望实际部署的服务器 (或者我们的开发服务器)来为我们提供这些文件的访问服务,所以我们只需要一个规则用来生成指向这些文件的 URL 。
import os
from flask import Flask, request, redirect, url_for
from werkzeug import secure_filename
UPLOAD_FOLDER = '/path/to/the/uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
下一步,就是检查文件类型是否有效、上传通过检查的文件、以及将用户重定向到已经上传好的文件 URL 处的函数了:
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
file = request.files['file'] # 获得文件 request.files['file'].read() 获得文件内容
if file and allowed_file(file.filename): #file.filename 获得文件内容
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('uploaded_file',filename=filename))
return ''
二、Tornado上传文件
1、简单的上传文件
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@url(r'/file/upload')
class FileUploadHandler(LoginedRequestHandler):
"""文件上传"""
def post(self):
data = self.request.files['file'][0]
filename = data.get('filename')
body = data.get('body')
if allowed_file:
self.write(dict(status=False, msg='请上传正确格式'))
else:
body = body.decode().strip()
self.write(dict(status=True, result=body))
2、上传图片
def post(self, *args, **kwargs):
status = self.get_argument('status',None)
size = int(self.request.headers.get('Content-Length'))
if size / 1000.0 > 2000:
self.set_status(400)
self.write(dict(msg="上传图片不能大于2M"))
return
file_info = self.request.files['file'][0]
file_name = generate_file_name(file_info['filename'])
if not file_name:
self.write(dict(code=-1, msg=Invalid file name))
return
year_month, day = time.strftime("%Y%m"), time.strftime("%d")
path = os.path.join(FILE_UPLOAD_PATH, year_month, day)
# 大图
absolute_path = os.path.join(path, file_name)
app_path = absolute_path[absolute_path.rindex('upload'):]
# 缩略图
crop_absolute_path = os.path.join(path, 'crop'+file_name)
crop_app_path = crop_absolute_path[crop_absolute_path.rindex('upload'):]
self.create_dir(path)
try:
with open(absolute_path, 'wb') as f:
f.write(file_info['body'])
if status:
from utils import crop_image
crop_image(crop_absolute_path, status)
self.write(dict(path= app_path,crop_path=crop_app_path))
except Exception as e:
app_log.error(e)
raise HTTPError(500)