我正在尝试创建一种使用Django提供可下载内容的简单方法。这个想法是登录用户应该能够通过lighttpd下载(相当大)文件。
这里有几个关于这个的帖子,我也来了一个blog post的简单解决方案。
我在上面提到的链接中创建了一个视图(并在lighttpd配置中添加了“allow-x-send-file”=>“enable”),并且它“有效”。当我使用Firebug检查标头时,我得到了正确的内容类型,文件长度和200 OK,但没有下载文件。
然后我找到了解决方案here on SO, where additional headers are sent。现在提供了一个文件,但下载的文件为空。标题仍然正确。
这是我的来源(删除了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
答案 0 :(得分:1)
查看您的来源 - 您不发送文件,只发送标题。
答案 1 :(得分:0)
1.5版之前的lighttpd使用X-LIGHTTPD-send-file
标题。