2010-02-05 85 views
3

我正尝试创建一个使用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 
+1

另外,请使用'python-magic'而不是'mimetypes'。 – 2010-02-05 20:43:55

+1

是的,我喜欢。为什么? – vorpyg 2010-02-05 21:08:10

回答

1

看看你的来源 - 你发送任何文件,只有头。

+0

我明白了!我想我应该将文件传递给HttpResponse对象。 Ref http://docs.djangoproject.com/zh/dev/ref/request-response/#telling-the-browser-to-treat-the-response-as-a-file-attachment – vorpyg 2010-02-05 21:16:53

0

lighttpd的1.5版之前的版本使用X-LIGHTTPD-send-file头。