• flask插件系列之flask_uploads上传文件


    前言

    flask可以实现上传文件和下载文件的基本功能,但如果想要健壮的功能,使用flask_uploads插件是十分方便的。

    安装

    pip install flask_uploads
    

    基本使用

    # extensions.py
    from flask_uploads import UploadSet
    files = UploadSet('files')
    
    # config.py
    UPLOADED_FILES_DEST = path.join(path.dirname(path.abspath(__file__)), "aitmsstatic") # 配置文件保存的目录,本参数必须设置;
    UPLOADED_FILES_ALLOW = ['apk', 'zip']  # 配置允许的扩展名,其他的都是不允许
    UPLOADED_FILES_DENY = ['html'] # 配置不允许的扩展名
    
    # form.py
    class VersionForm(FlaskForm):
        file = FileField('版本文件', validators=[DataRequired()])
    
        def validate_file(self, field):
            """
            验证文件的名字后缀是否合法
            :param field: file
            :return: None
            """
            if allowed_file(field.data.filename):
                return
            raise StopValidation('文件名后缀不合法!')
    
    # app.py
    configure_uploads(app, files)
    
    @app.route('/', methods=['GET', 'POST'])
    def upload_file():
        form = VersionForm()
        filename = None
        if request.method == 'POST' and 'file' in request.files:
            try:
                filename = files.save(request.files['file'])
                print(filename)
            except UploadNotAllowed as e:
                print(e)
                flash('失败')
            else:
                return redirect(url_for('tmsversion.index_view'))
        return self.render('admin/version.html', form=form, filename=filename)
    

    创建UploadSet对象管理上传,UploadSet.save方法保存文件,通过UploadNotAllowed捕捉扩展名错误。

    配置

    我们可以在app的配置文件里配置关于文件上传的参数。

    # files类的配置
    UPLOADED_FILES_DEST : 设置上传的文件将保存的目录;
    UPLOADED_FILES_URL:设置下载文件的url,包括尾部斜杠。
    UPLOADED_FILES_ALLOW:设置上传文件允许的文件扩展名,其他的都将被拒绝;
    UPLOADED_FILES_DENY:设置上传文件拒绝的文件扩展名;
    
    #所有的uploads共用的配置
    UPLOADS_DEFAULT_DEST:设置默认的上传的文件将保存的目录;
    UPLOADS_DEFAULT_URL:设置默认的下载url,包括尾部斜杠;
    

    注意

    实际应用中一般不止一处需要上传功能,每一处上传都需要一个UploadSet实例对象进行管理,同时也需要对每个UploadSet进行配置。

    files = UploadSet(name='files')
    photos = UploadSet(name='photos')
    
    # 同时初始化
    configure_uploads(app, [files, photos])
    
    # 配置参数使用UPLOADED_ + UploadSet.name + _DEST这种形式
    UPLOADED_FILES_DEST = xxx
    UPLOADED_PHOTOS_DEST = xxx
    

    UploadSet分析

    # 初始化属性
    name:名字,必须和配置的名字相对应;
    extensions:设置允许的文件扩展名;
    default_dest :设置默认的上传文件路径;
    
    # 常用方法
    
    UploadSet.url(filename):返回filename下载的url路径;
    UploadSet.path(filename):返回filename的绝对路径,不会检查该文件是否存在;
    UploadSet.config:返回配置;
    UploadSet.save(self, storage, folder=None, name=None):参数传入文件流werkzeug.FileStorage对象,folder为子目录,name保存为另一个名字,.结尾的话保留源文件的扩展名;
    UploadSet.file_allowed(self, storage, basename):检查一个文件是否被允许上传,basename指的是文件的名字;
    UploadSet.extension_allowed(ext): 检查一个文件扩展名是否允许,返回bool值。
    UploadSet.resolve_conflict(self, target_folder, basename):此方法用来解决如果目标中已存在同名文件的冲突。
    

    UploadSet对象的主要方法是save,该方法必须传入werkzeug.FileStorage对象作为参数,然后检查文件名是否合法,将其转换;检查文件的扩展名是否允许,不允许抛出UploadNotAllowed()错误;调用resolve_conflict方法解决文件名冲突问题;然后将目录和文件名拼接成绝对路径保存在目录下,最后返回文件名;

    参考

  • 相关阅读:
    第二周进度条博客
    软件工程个人作业01
    动手动脑1
    构建之法阅读笔记06
    构建之法阅读笔记05
    构建之法阅读笔记04
    poj 1631 LIS
    poj 1609 dp
    lightoj 1198 最大权重匹配
    hdu4696 想法题
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/9971023.html
Copyright © 2020-2023  润新知