Flask - 文件上传

  • 定义文件上传保存路径:
    (注意:第二个参数最后一定要加’/’)
app.config["UP_DIR"] = os.path.join(os.path.abspath(os.path.dirname(__file__)),'static/uploads/')
  • 定义表单
class MovieForm(FlaskForm):
    url = FileField(
        label='文件',
        validators=[
            DataRequired('请上传文件!')
        ],
        description='文件'
  • 文件名称规范化
    为了名称规范,我们使用“时间+随机字符串+文件后缀”方式命名
def change_filename(filename):
    fileinfo = os.path.splitext(filename) #把文件名分解为后缀和前缀
    filename = datetime.datetime.now().strftime('%Y%m%d%H%M%S')+str(uuid.uuid4().hex)+fileinfo[-1]
    return filename

有很多时候我们直接传入文件名是不安全的,需要secure_filename把文件名转化成安全的名称,这时我们需要定义加密函数:

  • 在视图函数中定义上传的操作:
@admin.route('/movie/add/',methods=['GET','POST'])
def movie_add():
    form = MovieForm()
    if form.validate_on_submit():
        data = form.data 
        #secure_filename使传入的文件名变得安全
        file_url = secure_filename(form.url.data.filename)
        file_logo = secure_filename(form.logo.data.filename)
        if not os.path.exists(app.config['UP_DIR']):
            #如果不存在存储的目录,则创建该目录
            os.makedirs(app.config['UP_DIR'])
            #设置该目录可读可写
            os.chmod(app.config['UP_DIR'],'rw')
        #名称规范化
        url = change_filename(file_url)
        logo = change_filename(file_logo)
        #进行保存
        form.url.data.save(app.config['UP_DIR']+url)
        form.logo.data.save(app.config['UP_DIR']+logo)
        #设施movie模型实例
        movie = Movie(
            url = url,
        )
        db.session.add(movie)
        db.session.commit()
        flash('添加电影成功','ok')
        return redirect(url_for('admin.movie_add'))
    return render_template('admin/movie_add.html',form=form)
  • 在HTML中添加表单及消息提示
{% for msg in get_flashed_messages(category_filter=['ok']) %} <!--取出的消息是OK的消息-->
<div class="alert alert-success alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
    <h4><i class="icon fa fa-check"></i> 操作成功!</h4>
{{ msg }}

{{ form.url}}

{% for err in form.url.errors %}
<div class="col-md-12">
    <font style="color:red">{{ err }}</font>
</div>
{% endfor %}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值