Сайт общего доступа к файлам в Python - PullRequest
3 голосов
/ 25 мая 2010

Я хотел спроектировать простой сайт, где один человек мог бы загрузить файл и передать случайный веб-адрес кому-то, кто мог бы затем загрузить его.

На данный момент у меня есть веб-страница, где кто-то может успешно загрузить файл, который хранится в / files / на моем веб-сервере.

Сценарий python также генерирует уникальный случайный пятибуквенный код, который сохраняется в базе данных, идентифицирующей файл

У меня есть другая страница под названием «извлечение», куда человек должен пойти, ввести 5-буквенный код, и должна появиться папка с вопросом, где сохранить файл.

Моя проблема в том, что: 1) Как получить файл для загрузки? На этом этапе мой скрипт извлечения, берет код, получает местоположение файла на моем сервере, но как мне заставить браузер начать загрузку?

2) Как я могу помешать людям напрямую обращаться к файлу? Должен ли я изменить права доступа к файлу?

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

Как вы обслуживаете страницу загрузки файлов и как вы разрешаете пользователям загружать файлы?
Если вы используете встроенные в Python модули HTTP-сервера, у вас не должно возникнуть никаких проблем.
В любом случае, вот как выполняется обработка файлов с помощью встроенных модулей Python (просто основная идея).

Что касается вашего второго вопроса, если бы вы использовали эти модули в первую очередь, вы, вероятно, не задали бы его, потому что вам пришлось бы явно обслуживать определенные файлы.

import SocketServer
import BaseHTTPServer


class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        # The URL the client requested
        print self.path

        # analyze self.path, map the local file location...

        # open the file, load the data
        with open('test.py') as f: data = f.read()

        # send the headers
        self.send_response(200)
        self.send_header('Content-type', 'application/octet-stream') # you may change the content type
        self.end_headers()
        # If the file is not found, send error code 404 instead of 200 and display a message accordingly, as you wish.

        # wfile is a file-like object. writing data to it will send it to the client
        self.wfile.write(data)

        # XXX: Obviously, you might want to send the file in segments instead of loading it as a whole


if __name__ == '__main__':

    PORT = 8080 # XXX

    try:
        server = SocketServer.ThreadingTCPServer(('', 8080), RequestHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()
0 голосов
/ 25 мая 2010

Вы должны отправить правильный HTTP-ответ, содержащий двоичные данные и заставить браузер реагировать на него.

Попробуйте это (у меня нет), если вы используете Django:

response = HttpResponse()
response['X-Sendfile'] = os.path.join(settings.MEDIA_ROOT, file.file.path)
content_type, encoding = mimetypes.guess_type(file.file.read())            
if not content_type:
    content_type = 'application/octet-stream'            
response['Content-Type'] = content_type            
response['Content-Length'] = file.file.size            
response['Content-Disposition'] = 'attachment; filename="%s"' % file.file.name
return response

Источник: http://www.chicagodjango.com/blog/permission-based-file-serving/

...