TheGarden
TheGarden

Reputation: 43

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

I need it when it is a file it downloads and when it is a directory it accesses the directory, could anyone help me? because when I go to a folder it gets /Python/Python/directory and does not access, like leaving it only /python/directory

Thanks

#!/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()

Upvotes: 2

Views: 302

Answers (1)

pbuck
pbuck

Reputation: 4551

Your def GET() is adding /Python/ to the start of every URL. This works the first time, because you GET /, and it returns you a list from /Python/ directory.

However, when you click on one of the items, say "foo" in the returned HTML, you're doing a GET /Python/foo. Then, again, your code adds another /Python, so it's looking at /Python/Python/foo. One idea is to add '/Python' only if incoming path is '/'.

Replace your first line under GET() with

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

You'll see some other problems with your current approach, though.

First, consider security. You're granting access to your whole server by allowing a user to request a file. So, make sure your python checks the resulting path is still within your sandbox:

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

Second, consider what happens if the user selects a file. You code will attempt:

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

which fails, because path is not a directory. So, put all that code within an if statement:

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

Finally, if someone does select a file, what to do? Put that in your else:

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

Upvotes: 1

Related Questions