17.上传和修改头像

上传文件,须要使用到htmlinput控件,其typefileBoostrap提供了一个美观且功能强大上传控件,样式以下:
clipboard.pngcss

clipboard.png

它提供文件的预览,而且自带removeupload按钮。要使用这个控件,须要再额外引入相应的jscss文件,以下:html

<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap-fileinput/4.4.6/css/fileinput.min.css"/>
<script src="https://cdn.bootcss.com/bootstrap-fileinput/4.4.6/js/fileinput.min.js"></script>

上传控件的html代码以下:flask

<form class="avatar-input-form" method="POST" enctype="multipart/form-data">
    <input name="avatar_upload" type="file" class="file" data-show-preview="false"/>
</form>

我把data-show-preview设置为false,关闭了上传文件的预览,更多关于这个控件的内容能够自行搜索。bootstrap

clipboard.png

此时修改头像的页面是这样的,咱们先完成功能,后续再美化。安全


那么如何获取上传的文件呢,与获取POST数据相似(上传文件其实也是使用POST方法),在flask中使用request.files[name]获取上传的文件,其中name为对应input控件的name值(name="avatar_upload"),而后使用文件的save方法便可保存。例如:session

@app.route('/user/avatar/', methods=['GET', 'POST'])
def avatar():
    if request.method == 'GET':
        return render_template('avatar.html')
    else:
        file = request.files['avatar_upload']
        path = "D:\\Flask\\HarpQA\\static\\"
        file.save(path + file.filename)
        return 'Saved'

注意save方法要加上具体的路径,默认不会保存到py文件所在的路径,而是系统的根目录,此时会提示Permission denied。咱们接下来要把上传的文件设置为用户的新头像,其实能够直接将useravatar_path修改成上传文件的路径,这样整个功能就完成了,但为了规范,咱们创建一个文件夹专门存放头像文件(static/images/uploads),而且以用户id来命名文件,这样就避免出现文件名重复致使被覆盖。修改视图函数,以下:app

@app.route('/user/avatar/', methods=['GET', 'POST'])
def avatar():
    if request.method == 'POST':
        file = request.files['avatar_upload']
        base_path = path.abspath(path.dirname(__file__))
        filename = str(g.user.id) + '.' + file.filename.rsplit('.', 1)[1]
        file_path = path.join(base_path, 'static', 'images', 'uploads', filename)
        file.save(file_path)
        g.user.avatar_path = 'images/uploads/' + filename
        db.session.commit()
    return render_template('avatar.html')

这里用了os库的path来处理路径相关的东西。随便浏览个本地图片并上传,效果以下:函数

clipboard.png

此时文件已经上传到了uploads文件夹:spa

clipboard.png

数据图中的avatar_path也更新了:code

clipboard.png

此外,咱们还能够添加上传文件大小限制,安全限制等更多的功能,在此就不演示了。

相关文章
相关标签/搜索