FLASK 上传文件 --- 使用flask_uploads插件

2018-10-21  本文已影响43人  MoonMonsterss

1.文件类型过滤

# photos是UploadSet的名字,这个名字将在配置中使用
# 第二个参数表示可上传文件类型,例如TEXT,DOCUMENTS,IMAGES
photos = UploadSet('photos', IMAGES)

# 这儿只能传入Flask对象,不能传入Blueprint对象
configure_uploads(_app, photos)



photos对象可以获得文件的url,basename,或者path,见之后的代码。

2.文件名过滤

UploadSet的save()函数可以直接从request中保存文件,并返回处理后的文件名。
这两个photo都是html中的input的name

if request.method == 'POST' and 'photo' in request.files:
# 将文件保存到本地
filename = photos.save(request.files['photo'])

3.限制文件大小

如果不设置参数,那么默认是16MB,如果需要传入参数,那么这么写

patch_request_class(_app, 10 * 1024 * 1024)

4.代码实现

4.1 config.py

配置文件
UPLOADED_PHOTOS_DEST ,这个数据之间的 PHOTOS 就是之后创建的UploadSet的name值。如果两者不匹配,将会报错:

    RuntimeError: no destination for set photos
DEBUG = True
SECRET_KEY = 'abcdefg'
# 设置文件路径
UPLOADED_PHOTOS_DEST = 'uploads'

4.2 create_app.py

该文件中,主要是创建Flask对象,并处理好相关配置。
看起来复杂了一点,主要是想让app和bp分离,然后app在一个单独的文件中处理,
但在设置configure_uploads函数时,又只能传入app对象,所以只能从views文件中把bp和photos对象引入进来,耦合度有点高。

from flask import Flask
from flask_uploads import patch_request_class, configure_uploads

from apps.upload_file.views import bp as bptwo, photos
import config

def _create_app():
    _app = Flask(__name__)
    # 加载配置文件
    _app.config.from_object(config)

    _app.register_blueprint(bptwo)
    configure_uploads(_app, photos)
    patch_request_class(_app)

    return _app


app = _create_app()

4.3 views.py
主要功能代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Flynn on 2018-08-29 18:12


from flask import Blueprint, request, render_template
from flask_uploads import UploadSet, IMAGES

bp = Blueprint('upload2', __name__, url_prefix='/upload2/')

# photos是UploadSet的名字,这个名字将在配置中使用
# 第二个参数表示可上传文件类型,例如TEXT,DOCUMENTS,IMAGES
photos = UploadSet('photos', IMAGES)


@bp.route('/', methods=['POST', 'GET'])
def index():
    context = {}
    file_url = None
    print(request.files)
    # photo是html中input的name
    if request.method == 'POST' and 'photo' in request.files:
        # 将文件保存到本地
        filename = photos.save(request.files['photo'])
        # 返回文件路径
        file_url = photos.url(filename)
        basename = photos.get_basename(filename)
        path = photos.path(filename)
        print('file_url =', file_url)  # http://127.0.0.1:8000/_uploads/photos/1525269617847e958494e4a.jpg
        print('basename =', basename)  # 1525269617847e958494e4a.jpg
        print('path =', path)  # uploads\1525269617847e958494e4a.jpg
    context['file_url'] = file_url
    return render_template('upload2/index.html', **context)

4.4 index.html
前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UploadFile2</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data">
    <input type="file" name="photo">
    <input type="submit" value="提交">
</form>
<br/>
<img src="{{ file_url }}">
</body>
</html>

参考

https://zhuanlan.zhihu.com/p/23731819
https://juejin.im/post/5b3089c151882574e94f0864
https://pythonhosted.org/Flask-Uploads/ #插件的官方文档
上一篇 下一篇

猜你喜欢

热点阅读