flask文件夹列表改进版--Bug追踪

把当前文件夹下的所有文件夹和文件列出来,允许点击返回上层目录,允许点击文件夹进入下级目录并显示此文件夹内容

允许点击文件进行下载

python3 复制代码
from flask import Flask, render_template, send_file, request, redirect, url_for
import os

app = Flask(__name__)

@app.route('/')
def index():
    files, folder_names, folder_name = getfile()
    return render_template('index.html', files=files, folder_names=folder_names, folder_name=folder_name)

@app.route('/download/<file_name>')
def download_file(file_name):
    return send_file(file_name, as_attachment=True)

@app.route('/show_folder/<folder_name>')
def show_folder(folder_name):
    files, folder_names, folder_name = getfile(folder_name)
    return render_template('index.html', files=files, folder_names=folder_names, folder_name=folder_name)

# 这里是返回上一级的目录
@app.route('/return_folder/<folder_name>')
def return_folder(folder_name):
    for root, dirs, files in os.walk(os.getcwd(), topdown=True):
        for dir in dirs:
            if folder_name == dir:
                folder_name = os.path.relpath(root, start=os.getcwd())
                if folder_name == ".":
                    folder_name = ""
                files, folder_names, folder_name = getfile(folder_name)
                return render_template('index.html', files=files, folder_names=folder_names, folder_name=folder_name)  


def getfile(folder_name=""):
    files = []
    folder_names = []
    fileList = os.listdir(os.path.join(os.getcwd(), folder_name))
    for file in fileList:
        if os.path.isfile(file):
            files.append(file)
        else:
            folder_names.append(file)
    return files, folder_names, folder_name
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Folder Viewer</title>
</head>
<body>

<h1>Folder Viewer</h1>
{% if folder_name == "" or folder_name %}
    {% if folder_name == "" %}
    <p>当前路径:</p>
    {% else %}
        <p>当前路径:</p>
            <li><a href="{{ url_for('return_folder', folder_name=folder_name) }}">返回:{{ folder_name }}</a></li>
    {% endif %}
    <form method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" value="Upload">
    </form>
    <ul>
        {% for filename in files %}
            <li><a href="{{ url_for('download_file', file_name=filename) }}" download>{{ filename }}</a></li>
        {% endfor %}
        {% for foldername in folder_names %}
            <li><a href="{{ url_for('show_folder', folder_name=foldername) }}">{{ foldername }}</a></li>
        {% endfor %}
    </ul>
{% else %}
    <p>No folder selected</p>
{% endif %}


</body>
</html>

效果:

主页面:

子目录:

点击返回可以返回上层目录:

Bug:

目前在子目录没办法下载

问题原因:

复制代码
<li><a href="{{ url_for('download_file', file_name=filename) }}" download>{{ filename }}</a></li>

这里的定义的路径不支持下载子目录的文件,需要优化 file_name,把子目录的路径包含进去

相关推荐
用户83562907805114 小时前
Python 实现 PowerPoint 形状动画设置
后端·python
ponponon15 小时前
时代的眼泪,nameko 和 eventlet 停止维护后的项目自救,升级和替代之路
python
Flittly15 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(5)Skills (技能加载)
python·agent
敏编程16 小时前
一天一个Python库:pyarrow - 大规模数据处理的利器
python
Flittly17 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(4)Subagents (子智能体)
python·agent
明月_清风1 天前
Python 装饰器前传:如果不懂“闭包”,你只是在复刻代码
后端·python
明月_清风1 天前
打破“死亡环联”:深挖 Python 分代回收与垃圾回收(GC)机制
后端·python
ZhengEnCi2 天前
08c. 检索算法与策略-混合检索
后端·python·算法
明月_清风2 天前
Python 内存手术刀:sys.getrefcount 与引用计数的生死时速
后端·python
明月_清风2 天前
Python 消失的内存:为什么 list=[] 是新手最容易踩的“毒苹果”?
后端·python