Flask 文件上传下载

Flask 文件上传

在 Flask 中处理文件上传非常简单。它需要一个 HTML 表单,其 enctype 属性设置为“multipart/form-data”,将文件发布到 URL。

URL 处理程序从 request.files[] 对象中提取文件,并将其保存到所需的位置。

每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。

目标文件的名称可以是硬编码的,也可以从 request.files[file] 对象的filename属性中获取。

但是,建议使用 secure_filename() 函数获取它的安全版本。

可以在 Flask 对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小。

app.config[‘UPLOAD_FOLDER’] 定义上传文件夹的路径

app.config[‘MAX_CONTENT_LENGTH’] 指定要上传的文件的最大大小(以字节为单位)

以下代码具有 '/upload' URL 规则,该规则在get请求下- templates 文件夹中显示 'upload.html',在post请求下用于调用 upload() 函数处理上传过程,在'/download/<filename>'请求下可以通过文件名下载对应提交文件。

'upload.html' 有一个文件选择器按钮和一个提交按钮。(界面较为简单,有需求可自己美化界面)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {# enctype设置不对字符编码 #}
    <form action="upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" accept=".jpg, .png" />
        <input type="submit" />
    </form>
</body>
</html>

以下是 Flask 应用程序的 Python 代码。

from flask import Flask, render_template, request, send_from_directory
from werkzeug.utils import secure_filename
import os
import uuid

app = Flask(__name__)

# 设置文件上传保存路径
app.config['UPLOAD_FOLDER'] = 'static/upload/'
# MAX_CONTENT_LENGTH设置上传文件的大小,单位字节
app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    # 如果是get请求响应上传视图,post请求响应上传文件
    if(request.method == 'GET'):
        return render_template('upload.html');
    else:
        f = request.files['file'];
        fname = secure_filename(f.filename);
        ext = fname.rsplit('.')[-1];
        # 生成一个uuid作为文件名
        fileName = str(uuid.uuid4()) + "." + ext;
        # os.path.join拼接地址,上传地址,f.filename获取文件名
        f.save(os.path.join(app.config['UPLOAD_FOLDER'], fileName))
        return 'ok';

# 图片下载
@app.route('/download/<filename>', methods=['GET'])
def download(filename):
    if request.method == "GET":
        #通过文件名下载文件
        path = os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], filename));
        if path:
            return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)

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

效果

当请求是get时,响应视图

响应视图

选择对应的图片文件上传

图片文件上传

上传成功后,可以在预设的文件夹下找到对应的图片

对应的图片

通过文件名下载对应上传的文件

通过文件名下载对应上传的文件

下载成功

下载成功

实际开发中,还可以在视图函数中把接收到的图片转为base64格式,存储在数据库中,方便存取。或者**使用专门OOS对象存储OSS(Object Storage Service)**进行存储。

如果你希望访问源码:Flask-code gitee

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值