Python - 如何程序化生成 Index.HTML 文件以列出上传文件夹的内容?

3 投票
2 回答
4155 浏览
提问于 2025-04-18 15:14

我有一个网络服务,用户可以把文件上传到“Uploads”文件夹。这些文件可以通过 /uploads/文件名.扩展名 的路径来访问。不过,除非我知道确切的文件名,否则我无法访问这些文件。

如果用户输入 /uploads,怎么才能通过编程的方式生成一个网页,显示 /uploads 文件夹里所有文件的列表呢?

from flask import Flask
from flask import Response, jsonify, request, redirect, url_for
import os
from werkzeug.utils import secure_filename


#configuration
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER


#retrieve uploads by name
@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'],
                               filename)


def allowed_file(filename):
    return '.' in filename and \
        filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

################# AUDIO NOTES UPLOAD  ####################
@app.route('/', methods=['GET', 'POST'])
def upload_file():
    print 'upload file'

    try:
        os.stat(app.config['UPLOAD_FOLDER'])
    except:
        os.mkdir(app.config['UPLOAD_FOLDER'])

    if request.method == 'POST':
        file = request.files['file']
        print 'filename: ' + file.filename

        if file and allowed_file(file.filename):
            print 'allowing file'
            filename = secure_filename(file.filename)
            print 'secure filename created'
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            print 'file saved'
            return redirect(url_for('uploaded_file',filename=filename))

    return '''
        <!doctype html>
        <title>Upload new File</title>
        <h1>Upload new File</h1>
        <form action="" method=post enctype=multipart/form-data>
        <p><input type=file name=file>
        <input type=submit value=Upload>
        </form>
        '''



################## APP LAUNCH POINT ############################
if __name__ == '__main__':
    app.run(host='0.0.0.0')

############################################################

2 个回答

1

听起来你需要列出上传文件夹里面的所有文件。Python的 os.listDir() 可以帮你做到这一点。我用 listDir 来获取所有文件的名字,然后把这些名字作为参数传给我的视图。

def get_files_from_directory(path):
    list_of_files = []
    if len(path) > 0:
        list_of_files = [ f for f in listdir(path) if isfile(join(path,f)) ]
    return list_of files

你可以这样做:

@app.route('/uploads/<path>')
def list_uploads(path):
    list_of_uploads = get_files_from_directory(path)
    #render your template with this list_of_uploads.

我建议你不要让用户自己输入路径。这可能会带来很大的安全风险。相反,可以创建一个像这样的链接:'http://www.yourwebsite.com/uploads/list'。这样就可以通过你在服务器端代码中设置的路径来获取用户想查看的文件。这会安全得多。

4

稍微有点跑题,因为原问题是关于Python的,不过你可以用 tree 命令生成一个静态的HTML目录列表,方法是把输出格式设置为HTML:

tree -H "/uploads" -L 1 > index.html

这里的选项 -L 1 是用来限制只列出当前文件夹里的内容。如果不加这个选项,列表会递归地包含所有的子文件夹。

这个命令在大多数Linux发行版的标准软件库里都有。比如在Ubuntu上,你可以通过 sudo apt install tree 来安装它。

相关链接我怎么能创建一个简单的index.html文件,列出所有文件和目录?

撰写回答