Flask文件上传

这篇博客介绍了如何在Flask中简化文件上传操作,利用'flask-wtf'扩展进行文件提交,并讨论了如何生成缩略图,处理'PIL'库在Python 3中的兼容性问题,以及如何通过'flask-bootstrap'美化前端页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Flask中实现文件的上传,传统的方法比较繁琐,因此我们使用Flask为我们封装好的库来进行文件上传操作。

优点:优化了文件上传操作,使用方便

准备工作

安装文件上传需要用到的库

pip install flask-uploads

正式操作

我们计划使用Flask中表单处理的扩展库'flask-wtf'来实现文件提交的功能

导入类库

#文件类库
from flask_uploads import UploadSet,IMAGES,configure_uploads,path_request_class
#表单类库
from flask_wtf import FlaskForm
from wtforms import SubmitField
from flask_wtf.file import FileField,FileAllowed.FileRequired

创建对象

#上传文件保存位置
#此处[]中的内容要写成'UPLOADED_名字_DEST',名字:创建上传对象时第一个参数大写
app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(),'static/upload')

#加密
app.config['SECRET_KEY'] = '123456'

#文件大小限制
app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 8

#创建上传对象,指定名字和上传文件的类型
photos = UploadSet('photos',IMAGES)

#配置上传对象
configure_uploads(app,photos)

#设置上传文件大小,默认64M,设置为None时,大小由'MAX_CONTENT_LENGTH'决定
patch_request_class(app,size=None)

创建表单类

class UploadForm(FlaskForm):
    photo = FileField('头像',validators=[FileRequired('请选择文件'),FileAllowed(photos,'只能上传图片类型')])
    submit = SubmitField('上传')

添加视图函数

@app.route('/upload/',methods=['GET','POST'])
def upload():
    #创建表单对象
    form = UploadForm()
    if form.validate_on_submit():
        #提取上传文件信息
        photo = form.photo.data
        if photo:
            photos.save(photo)
            return '文件上传成功'
        return '文件上传失败'
    return render_template('upload.html',form=form)

以上就是最简单的Flask使用flask-uploads库实现文件上传操作了,当然我们也可以添加一些其他的功能,比如说将上传的图片名字改为随机字符串加后缀的形式,接着修改图片尺寸,生成缩略图,然后再保存。

生成缩略图需要用到'PIL'库,但是这个库只支持 py2 版本,所以我们需要安装一个补丁,使这个库在 py3 中也能够使用

pip install pillow

首先,我们需要定义一个生成随机字符串的函数

#生成随机字符串
def random_string(Length=32):
    import random
    base_str = '0123456789abcdefghijklmnopqrs'
    return ''.join(random.choice(base_str) for i in range(Length))

接着,修改视图函数

form = UploadForm()
    if form.validate_on_submit():
        #提取上传文件信息
        photo = form.photo.data
        if photo:
            #提取文件后缀
            suffix = os.path.splitext(photo.filename)[1]
            #生成随机文件名
            filename = random_string() + suffix
            #保存文件
            photos.save(photo,name=filename)
            #生成缩略图
            from PIL import Image
            #拼接完整路径名
            pathname = os.path.join(app.config['UPLOADED_PHOTOS_DEST'],
                                    filename)
            #打开文件
            img = Image.open(pathname)
            #设置尺寸
            img.thumbnail((64,64))
            #重新保存
            img.save(pathname)
            # return '上传成功'
    return render_template('upload.html',form=form)

最后我们要是想要美化一下我们的前端页面,我们可以使用'flask-bootstrap'库

安装方法同样是

pip install flask-bootstrap

导入类库 'from flask_bootstrap import Bootstrap',创建对象 ' Bootstrap(app)',接下来在前端即可使用Bootstrap库

{% extends 'bootstrap/base.html' %}

{% from 'bootstrap/wtf.html' import quick_form %}

{% block title %}
    完整的文件上传
{% endblock %}

{% block content %}
    <div class="container">
        <h1>文件上传测试</h1>
        {{ quick_form(form) }}
    </div>
{% endblock %}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值