文件下载和目录访问 Python(web.py) + HTML

File Download and Directory Access Python(web.py) + HTML

我需要它,当它是一个文件时它会下载,当它是一个目录时它会访问该目录,有人可以帮助我吗?因为当我转到一个文件夹时,它会得到 /Python/Python/directory 并且无法访问,就像只保留它 /python/directory

谢谢

#!/usr/bin/python

import web
import os
urls = (
    '/(.*)', 'hello'
    )
app = web.application(urls, globals())

class hello:
    def GET(self, path):

        path = '/Python/'+path
        lista = '<html> <body>'
        caminhos = [os.path.join(path, nome) for nome in os.listdir(path)]
        diretorios = [dire for dire in caminhos if os.path.isdir(dire)]
        for dire in diretorios:
#            lista = lista+dire+'<br>'
            lista = lista+'<a href='+dire+'>'+dire+'</a><br>'
        arquivos = [arq for arq in caminhos if os.path.isfile(arq)]
        for arq in arquivos:
            lista = lista+'<a href='+arq+' target="_blank">'+arq+'</a><br>'
#            lista = lista+arq+'<br>'
        lista = lista+'<br><br><a href="javascript:window.history.go(-1)">Voltar</a></body> </html>'
        return lista


if __name__ == "__main__":
    app.run()

您的 def GET() 将 /Python/ 添加到每个 URL 的开头。这是第一次工作,因为你 GET /,它 returns 你是 /Python/ 目录中的列表。

但是,当您单击其中一项时,在返回的 HTML 中说 "foo",您正在执行 GET /Python/foo。然后,您的代码再次添加了另一个 /Python,因此它正在查看 /Python/Python/foo。一种想法是仅当传入路径为“/”时才添加“/Python”。

将 GET() 下的第一行替换为

if path == '':
    path = '/Python/' + path
else:
    path = '/' + path

不过,您会发现当前方法存在一些其他问题。

首先,考虑安全性。您通过允许用户请求文件来授予对整个服务器的访问权限。因此,请确保您的 python 检查生成的路径仍在您的沙箱中:

if not os.path.normpath(path).startswith('/Python/'):
    return 'Error'

其次,考虑如果用户 select 有一个文件会发生什么。您的代码将尝试:

caminhos = [os.path.join(path, nome) for nome in os.listdir(path)]

失败,因为路径不是目录。所以,将所有代码放在一个 if 语句中:

if os.path.isdir(path):
    caminhos = [os.path.join.....
    ...
    lista = lista+'<br><br....

最后,如果有人select一个文件,怎么办?将其放入您的 else:

else:
    return open(path, 'r').read()