我正尝试创建一个使用Django提供可下载内容的简单方法。这个想法是,登录的用户应该能够通过lighttpd下载(相当大的)文件。用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
另外,请使用'python-magic'而不是'mimetypes'。 – 2010-02-05 20:43:55
是的,我喜欢。为什么? – vorpyg 2010-02-05 21:08:10