IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python Flask - 实现本地文件的上传与下载 -> 正文阅读

[Python知识库]Python Flask - 实现本地文件的上传与下载

作者:recommend-item-box type_blog clearfix

场景:

  • 点击上传文件按钮,选择需要上传的文件后上传
    • 文件上传成功后,会将文件保存到指定目录下
    • 限制上传文件的格式
  • 在前端点击文件后下载
    • 基于上述上传并保存到指定目录下的文件

上手

文件上传

app.py


@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    # 渲染文件
    return render_template('upload.html')

# 文件保存的目录,根据实际情况的文件结构做调整;
# 若不指定目录,可以写成f.save(f.filename),可以默认保存到当前文件夹下的根目录
# 设置上传文件保存路径 可以是指定绝对路径,也可以是相对路径(测试过)
app.config['UPLOAD_FOLDER'] = './upload'
# 将地址赋值给变量
file_dir = app.config['UPLOAD_FOLDER']


@app.route('/uploader', methods=['GET', 'POST'])
def uploader():
    """
        文件上传
    """
    if request.method == 'POST':
        # input标签中的name的属性值
        f = request.files['file']

        # 拼接地址,上传地址,f.filename:直接获取文件名
        f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
        # 输出上传的文件名
        print(request.files, f.filename)

        return '文件上传成功!'
    else:
        return render_template('upload.html')

upload.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>上传</title>

        <style>
            a{
                text-decoration: none;
                color: #2062e0;
            }
            a:hover{
                text-decoration: none;
                color: #2062e0;
            }
        </style>
    </head>
    <body>
        <h1 align="center">TEST</h1>
        <div align="center">
        	{# enctype:属性用于指定将上传文件数据发送给服务器端之前对表单数据进行编码的斱式 #}
        	{# enctype="multipart/form-data" => 表示不对字符编码。当使用有文件上传控件的表单时,该值是必需的。 #}
            <form action="/uploader" method="post" enctype="multipart/form-data">
                <br><br><br>
                {# accept可以自定以文件上传格式 #}
                <input type="file" name="file" accept=".txt, .pdf, .doc, .docx, .md" value="{{ csrf_token }}" />
                <br><br><br>
                <input type="submit" value="提交" />
            </form>

            <br><br><br>
        </div>
    </body>
</html>

文件下载

app.py

@app.route('/download', methods=['GET', 'POST'])
def download():
    """
        文件下载
    :return:
    """
    timelist = []   # 获取指定文件夹下文件并显示
    Foder_Name = []     # 文件夹下所有文件
    Files_Name = []     # 文件名

    # 获取到指定文件夹下所有文件
    lists = os.listdir(file_dir + '/')

    # 遍历文件夹下所有文件
    for i in lists:
        # os.path.getatime => 获取对指定路径的最后访问时间
        timelist.append(time.ctime(os.path.getatime(file_dir + '/' + i)))

    # 遍历文件夹下的所有文件
    for k in range(len(lists)):
        # 单显示文件名
        Files_Name.append(lists[k])
        # 获取文件名以及时间信息
        Foder_Name.append(lists[k] + " ~~~~~~~~~~~~~~~~~~~~~ " + timelist[k])

    print(file_dir)     # ./upload

    return render_template('download.html', allname=Foder_Name, name=Files_Name)


@app.route('/downloads/<path:path>', methods=['GET', 'POST'])
def downloads(path):
    """
        重写download方法,根据前端点击的文件传送过来的path,下载文件
	
		send_from_directory:用于下载文件
		flask.send_from_directory(所有文件的存储目录,相对于要下载的目录的文件名,as_attachment:设置为True是否要发送带有标题的文件)
    :param path:
    :return:
    """
    return send_from_directory(app.config['UPLOAD_FOLDER'], path, as_attachment=True)

download.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>文件下载</title>

        <style>
            a{
                text-decoration: none;
                color: #2062e0;
            }
            a:hover{
                text-decoration: none;
                color: #2062e0;
            }
        </style>

    </head>
    <body>
        <div align="center">
            <h1>文件下载</h1><br><br>
            {# 输出文件名及文件详细信息(文件时间信息等) #}
            {% for fruit in allname %}
                <br>
                {{ fruit }}
            {% endfor %}
            <br><br><br><br>
            {# 将指定文件夹中的文件获取遍历显示 #}
            {% for n in name %}

                <a href="downloads/{{ n }}">{{ n }}</a>
                <br><br>

            {% endfor %}
        </div>
    </body>
</html>

运行

  • 文件上传和下载的视图函数代码都完成后,开始运行项目

app.py(在编写好试图代码的最下方编写运行代码)

"""
    运行项目
"""
if __name__ == '__main__':
	# 可以使统一局域网下的其他电脑访问该项目
    HOST = '0.0.0.0'
    # 项目运行端口
    PORT = 8990
    # debug=True => 打开调试模式,在对代码进行修改后,可以实时运行代码
    app.run(host=HOST, port=PORT, debug=True)
  • 打开调试模式后,运行项目建议在Pycharm中的Terminal命令行中输入以下运行
    python app.py
    
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:19:02  更:2022-07-17 16:19:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:11:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码