Python Web框架(flask,tornado)之文件上传

一、Flask上传文件

1、一个 

 标签被标记有 enctype=multipart/form-data ,并且在里面包含一个  标签。

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)

 

你可能感兴趣的:(Linux,tornado)