2010-06-29 81 views
2

我在写一个简单的函数,用于从服务器下载某个文件到我的机器。 该文件由其ID代表唯一。该文件正确定位,下载完成,但下载的文件(尽管命名为服务器上的文件)为空。 我的下载功能看起来像这样:Django下载文件清空

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 

我可以在哪里出错?谢谢!

回答

2

我回答了这个问题here,希望有帮助。

+0

此答案帮助了我! (奖金将在22小时内给出 - 因为我今天已经开始了,至少可以接受22小时的答案) – dana 2010-07-09 15:54:48

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配置,我猜。

+0

喜描述,SRY用于延迟在模块中使用。我编辑了新的代码,但实际上它下载了我的脚本:D ,因为那当然是__file__。我应该用什么替换__file__以便下载是正确的?谢谢! – dana 2010-06-30 16:59:26

+0

那么'__file__'当然是Python脚本文件名。您需要将其替换为应该下载的文件的文件名(我认为这与应用程序有关)。 – AndiDog 2010-06-30 18:03:27

+0

嗯..我猜想是这样的,我用课程取代了它,当然这里是链接course = Courses.objects.get(pk = id).course的课程,但是我的错误是:强制转换为Unicode:need string或缓冲区,FieldFile发现 – dana 2010-06-30 18:15:44