flask中的文件上传

文件上传是web中必不可少的一项工作。在flask中的文件上传是怎么实现的呢?
一、原生实现
flask文件的原生上传可分为三步:
1.创建上传表单,配置上传配置
2.获取文件
3.保存文件,下载展现使用文件
具体代码如下:

import os
from flask import Flask, request, url_for, send_from_directory
from werkzeug import secure_filename
#配置上传配置
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = os.getcwd()
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

#创建上传表单(form中的input标签,属性type设置为file,name设置为file)
html = '''
    <!DOCTYPE html>
    <title>Upload File</title>
    <h1>图片上传</h1>
    <form method=post enctype=multipart/form-data>
         <input type=file name=file>
         <input type=submit value=上传>
    </form>
    '''
#获取并保存文件
@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file :
            filename = file.filename
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
           
    return html
#下载使用图片,下载使用send_from_directory(path,filename);使用通过url_for(下载的视图函数)
#下载
@app.route('/download/<filename>')
def download_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'],
                               filename)
 #使用                              
return <img src="+url_for('download_file',filename=filename)+">

if __name__ == '__main__':
    app.run()

二、使用flask-dropzone优化文件上传
上文完成了文件的上传的 以下几步:
1.创建上传区域
2.文件验证(大小,类型,通过配置length和allowed_exteinsons设置)
3.视图函数对于文件获取和存储(通过f=request.files[‘file’]获取,通过f.save()保存)
4.文件的使用(通过send_from_directory()获取图片)
但是文件的上传仅仅这样是不够的,用户希望界面更加友好一些(比如有上传进度,拖曳上传等)
这些功能可以通过js在前端实现。比较常用的有Dropzone.js.flask-dropzone集成了Dropzone的大部分功能。(具体怎么实现的显示进度条和拖曳上传被封装在扩展中了,我暂时还没有深究)
Flask-Dropzone在模板中提供了一些方法来帮助创建上传区域,引入相关资源。只需要添加一些配置就可以实现上传类型的过滤,文件大小限制,上传后跳转等功能。所以flask-dropzone极大的简化了文件上传的处理,使之非常简单方便。

#html代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Flask-Dropzone Demo: Basic</title>
  {{ dropzone.load_css() }}
  {{ dropzone.style('border: 2px dashed red; margin: 10%; min-height: 400px;') }}
  {{ dropzone.load_js() }}
</head>
<body>
  {{ dropzone.create(action='upload') }}

  {{ dropzone.config() }}
</body>
</html>
#视图函数代码:
import os

from flask import Flask, render_template, request
from flask_dropzone import Dropzone

basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)

app.config.update(
    UPLOADED_PATH=os.path.join(basedir, 'uploads'),
    # Flask-Dropzone config:
    DROPZONE_ALLOWED_FILE_TYPE='image',
    DROPZONE_MAX_FILE_SIZE=3,
    DROPZONE_MAX_FILES=30,
)

dropzone = Dropzone(app)


@app.route('/', methods=['POST', 'GET'])
def upload():
    if request.method == 'POST':
        f = request.files.get('file')
        f.save(os.path.join(app.config['UPLOADED_PATH'], f.filename))
    return render_template('index.html')


if __name__ == '__main__':
    app.run(debug=True)

flask-dropzone提供了完整的的配置,你可以 根据自己的需要进行修改。
在这里插入图片描述
在这里插入图片描述
flask_dropzone实质是封装了Dropzone.js中对于前段文件上传的设置,包括样式和功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值