使用python的Flask框架进行上传和下载文件详解

 更新时间:2023年07月25日 09:36:57   作者:IT之一小佬  
这篇文章主要介绍了使用python的Flask框架进行上传和下载文件详解,Flask是一个使用Pyhton编写的轻量级Web应用框架,工具包采用Werkzeug,模板引擎则使用Jinja2,是目前十分流行的web框架,需要的朋友可以参考下

send_file()函数:

def send_file(
    path_or_file: t.Union[os.PathLike, str, t.BinaryIO],
    mimetype: t.Optional[str] = None,
    as_attachment: bool = False,
    download_name: t.Optional[str] = None,
    attachment_filename: t.Optional[str] = None,
    conditional: bool = True,
    etag: t.Union[bool, str] = True,
    add_etags: t.Optional[bool] = None,
    last_modified: t.Optional[t.Union[datetime, int, float]] = None,
    max_age: t.Optional[
        t.Union[int, t.Callable[[t.Optional[str]], t.Optional[int]]]
    ] = None,
    cache_timeout: t.Optional[int] = None,
):

参数解析:

  • path_or_file:要发送的文件的路径,如果给出了相对路径,则相对于当前工作目录。或者,以二进制模式打开的类文件对象。确保将文件指针查找到数据的开头。
  • mimetype:为文件发送的MIME类型。如果没有提供,它将尝试从文件名检测它。
  • as_attachment:指示浏览器应该提供给保存文件而不是显示它。
  • download_name:浏览器保存文件时使用的默认名称。默认为传递的文件名。
  • conditional:基于请求头启用条件响应和范围响应。需要传递一个文件路径和``environ``。
  • etag:计算文件的etag,这需要传递一个文件路径。也可以是字符串来代替。
  • last_modified:发送文件的最后修改时间,单位为秒。如果没有提供,它将尝试从文件路径检测它。
  • max_age:客户端应该缓存文件多长时间,以秒为单位。如果设置,' ' Cache-Control ' '将为' ' public ' ',否则将为' ' no-cache ' '以选择条件缓存。

注意:

示例代码:

import os
from flask import Flask, send_file, request, render_template, redirect
from werkzeug.utils import secure_filename
app = Flask(__name__)
UPLOAD_FOLDER = 'media'  # 注意:要提前在根目录下新建media文件,否则会报错
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 判断上传的文件是否是允许的后缀
def allowed_file(filename):
    return "." in filename and filename.rsplit('.', 1)[1].lower() in set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
@app.route('/')
def index():
    return "hello world!"
@app.route('/generate_file')
def generate_file():
    with open('./new_file.txt', 'w', encoding='utf-8') as f:
        f.write('我是new_file.txt文件!')
    return "<./new_file.txt>文件已经生成!"
@app.route('/download')
def download():
    return send_file('./new_file.txt', as_attachment=True)
@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        if "file" not in request.files:
            return redirect(request.url)
        file = request.files.get('file')  # 获取文件
        # 上传空文件(无文件)
        if file.filename == '':
            return redirect(request.url)
        if file and allowed_file(file.filename):
            if not os.path.exists(f'./templates/{UPLOAD_FOLDER}'):
                os.mkdir(f'./templates/{UPLOAD_FOLDER}')
            filename = secure_filename(file.filename)  # 用这个函数确定文件名称是否是安全 (注意:中文不能识别)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # 保存文件
            return "上传文件成功!"
if __name__ == '__main__':
    app.run()

下载和上传路径中可以添加用户身份验证:

import os
from flask import Flask, send_file, request, render_template, redirect
from werkzeug.utils import secure_filename
app = Flask(__name__)
UPLOAD_FOLDER = 'media'  # 注意:要提前在根目录下新建media文件,否则会报错
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
allow_users = ['dgw', 'super_user']
# 判断上传的文件是否是允许的后缀
def allowed_file(filename):
    return "." in filename and filename.rsplit('.', 1)[1].lower() in set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
@app.route('/')
def index():
    return "hello world!"
@app.route('/generate_file')
def generate_file():
    with open('./new_file.txt', 'w', encoding='utf-8') as f:
        f.write('我是new_file.txt文件!')
    return "<./new_file.txt>文件已经生成!"
@app.route('/download')
def download():
    user_name = request.args.get('user_name')
    if not user_name:
        return "你没有权限下载文件!"
    if user_name and user_name not in allow_users:
        return "你没有权限下载文件!"
    return send_file('./new_file.txt', as_attachment=True)
@app.route('/upload/<string:user_name>', methods=['GET', 'POST'])
def upload(user_name):
    if request.method == 'GET':
        if user_name not in allow_users:
            return "您没有权限访问此页面!"
        return render_template('upload.html')
    else:
        if user_name not in allow_users:
            return "您没有权限访问此页面!"
        if "file" not in request.files:
            return redirect(request.url)
        file = request.files.get('file')  # 获取文件
        # 上传空文件(无文件)
        if file.filename == '':
            return redirect(request.url)
        if file and allowed_file(file.filename):
            if not os.path.exists(f'./templates/{UPLOAD_FOLDER}'):
                os.mkdir(f'./templates/{UPLOAD_FOLDER}')
            filename = secure_filename(file.filename)  # 用这个函数确定文件名称是否是安全 (注意:中文不能识别)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # 保存文件
            return "上传文件成功!"
if __name__ == '__main__':
    app.run()

附录:

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>
</body>
</html>

到此这篇关于使用python的Flask框架进行上传和下载文件详解的文章就介绍到这了,更多相关python的Flask框架上传下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python Pangu自动美化中文排版工具使用探索

    python Pangu自动美化中文排版工具使用探索

    这篇文章主要为大家介绍了python Pangu自动美化中文排版工具使用探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python flask sqlalchemy的简单使用及常用操作

    Python flask sqlalchemy的简单使用及常用操作

    这篇文章主要介绍了Python flask sqlalchemy的简单使用及常用操作,在python中,常用的ORM工具就是sqlalchemy了。下面就以一个简单的flask例子来说明吧,需要的小伙伴可以参考一下
    2022-08-08
  • python神经网络使用tensorflow实现自编码Autoencoder

    python神经网络使用tensorflow实现自编码Autoencoder

    这篇文章主要为大家介绍了python神经网络使用tensorflow实现自编码Autoencoder,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python实现打印类的所有属性和方法

    python实现打印类的所有属性和方法

    这篇文章主要介绍了python实现打印类的所有属性和方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vscode搭建python Django网站开发环境的示例

    vscode搭建python Django网站开发环境的示例

    本文主要介绍了vscode搭建python Django网站开发环境的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python人工智能算法之差分进化算法的实现

    python人工智能算法之差分进化算法的实现

    DE基于GA,正如进化基于遗传,和遗传算法相比,差分进化引入了差分变异模式,相当于开辟了一条崭新的进化路径,下面就来看看差分优化算法是如何实现的吧
    2023-08-08
  • Python3 实现爬取网站下所有URL方式

    Python3 实现爬取网站下所有URL方式

    今天小编就为大家分享一篇Python3 实现爬取网站下所有URL方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 利用Matlab提取图片曲线

    利用Matlab提取图片曲线

    一张图片,怎样才可以提取里面曲线的数据,从而协助我们完成其他需要的数据呢?本文通过示例来进行说明,文中大量的代码以及图片都可以帮助小伙伴们了解
    2021-08-08
  • python 从远程服务器下载东西的代码

    python 从远程服务器下载东西的代码

    python实现从远程服务器下载东西的代码,有需要的朋友可以参考下
    2013-02-02
  • Python3 webservice接口测试代码详解

    Python3 webservice接口测试代码详解

    这篇文章主要介绍了Python3 webservice接口测试代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06

最新评论