3

Djangoでダウンロード可能なコンテンツを提供する簡単な方法を作成しようとしています。ログインしたユーザーは、lighttpdを介して(かなり大きな)ファイルをダウンロードできるようにするという考え方です。

SOにはこれに関するいくつかの投稿があり、簡単な解決策のあるブログ投稿にも出くわしました。

上記のリンクのようにビューを作成し(そして、lighttpd設定に「allow-x-send-file」=>「enable」を追加しました)、それは一種の「動作」します。Firebugでヘッダーを確認すると、正しいコンテンツタイプ、ファイル長、200 OKが表示されますが、ファイルがダウンロードされません。

次に、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
4

2 に答える 2

1

ソースを見てください。ファイルは送信せず、ヘッダーのみを送信します。

于 2010-02-05T21:02:21.870 に答える
0

1.5より前のバージョンのlighttpdは、X-LIGHTTPD-send-file代わりにヘッダーを使用します。

于 2010-02-05T21:12:58.730 に答える