2

我正在编写一个简单的函数,用于将某个文件从服务器下载到我的机器上。该文件由其 id 表示是唯一的。文件正确定位,下载完成,但下载的文件(虽然命名为服务器上的文件)是空的。我的下载功能如下所示:

def download_course(request, id):
    course = Courses.objects.get(pk = id).course
    path_to_file = 'root/cFolder'
    filename = __file__ # Select your file here.                                
    wrapper = FileWrapper(file(filename))
    content_type = mimetypes.guess_type(filename)[0]
    response = HttpResponse(wrapper, content_type = content_type)
    response['Content-Length'] = os.path.getsize(filename)
    response['Content-Disposition'] = 'attachment; filename=%s/' % smart_str(course)

    return response

我哪里错了?谢谢!

4

3 回答 3

2

看起来你没有发送任何数据(你甚至没有打开文件)。

Django 有一个很好的用于发送文件的包装器(代码取自djangosnippets.org):

def send_file(request):
    """                                                                         
    Send a file through Django without loading the whole file into              
    memory at once. The FileWrapper will turn the file object into an           
    iterator for chunks of 8KB.                                                 
    """
    filename = __file__ # Select your file here.                                
    wrapper = FileWrapper(file(filename))
    response = HttpResponse(wrapper, content_type='text/plain')
    response['Content-Length'] = os.path.getsize(filename)
    return response

所以你可以使用类似的东西response = HttpResponse(FileWrapper(file(path_to_file)), mimetype='application/force-download')

如果您真的在使用 lighttpd(因为“X-Sendfile”标头),我猜您应该检查服务器和 FastCGI 配置。

于 2010-06-29T14:42:08.153 回答
2

我在这里回答了这个问题,希望对您有所帮助。

于 2010-07-09T15:51:35.347 回答
1

尝试以下方法之一:

1)如果您正在使用GZipMiddleware,请禁用它;

2) 对https://code.djangoproject.com/ticket/6027中描述的 django/core/servers/basehttp.py 应用补丁

于 2012-03-18T16:17:52.373 回答