Обслуживание файлов с помощью Django и lighttpd - PullRequest
3 голосов
/ 05 февраля 2010

Я пытаюсь создать простой способ подачи загружаемого контента с помощью Django. Идея состоит в том, что вошедшие в систему пользователи должны иметь возможность загружать (довольно большие) файлы через lighttpd.

Есть несколько сообщений об этом здесь на SO, и я наткнулся на сообщение в блоге с простым решением.

Я создал вид, как в приведенной выше ссылке (и добавил «allow-x-send-file» => «enable» в конфигурацию lighttpd), и он «работает». Когда я проверяю заголовки с помощью Firebug, я получаю правильный тип контента, длину файла и 200 ОК, но файл не загружается.

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

Вот мой источник (с удаленными auth_decorators и без обработки несуществующего файла):

import os
import mimetypes
import django.http

from django.conf import settings

def get_absolute_filename(filename='', safe=True):
    if not filename:
        return os.path.join(settings.FILE_DOWNLOAD_PATH, 'index')
    if safe and '..' in filename.split(os.path.sep):
        return get_absolute_filename(filename='')
    return os.path.join(settings.FILE_DOWNLOAD_PATH, filename)

def retrieve_file(request, filename=''):
    abs_filename = get_absolute_filename(filename)
    response = django.http.HttpResponse(mimetype='application/force-download')
    response['X-Sendfile'] = abs_filename
    response['Content-Disposition'] = 'attachment; filename=%s' % abs_filename
    response['Content-Type'] = mimetypes.guess_type(abs_filename)
    response['Content-Length'] = os.path.getsize(abs_filename)
    return response

Ответы [ 2 ]

1 голос
/ 06 февраля 2010

Посмотрите на свой источник - вы не отправляете файл, только заголовки.

0 голосов
/ 06 февраля 2010

До версии 1.5 lighttpd использует заголовок X-LIGHTTPD-send-file.

...