2013-04-03 123 views
12

我试图提供一些txt文件生成的一些内容,我有一些问题。我创建了临时文件并使用NamedTemporaryFile编写内容,并将delete设置为false以进行调试,但下载的文件不包含任何内容。Django提供下载文件

我的猜测是响应值不指向正确的文件,hense没有被下载,我的继承人代码:

f = NamedTemporaryFile() 
    f.write(p.body) 

    response = HttpResponse(FileWrapper(f), mimetype='application/force-download') 
    response['Content-Disposition'] = 'attachment; filename=test-%s.txt' % p.uuid 
    response['X-Sendfile'] = f.name 
+0

不要忘记在其他之前刷新文件:f.flush。 – dsign

+0

有关使用Django提供文件的更多详细信息,请参阅:http://stackoverflow.com/q/1156246/462865 –

回答

19

你有没有考虑只是通过response这样发送p.body

response = HttpResponse(mimetype='text/plain') 
response['Content-Disposition'] = 'attachment; filename="%s.txt"' % p.uuid 
response.write(p.body) 
+1

在Django 1.9中,它应该是response = HttpResponse(p.body,content_type ='text/plain'); response ['Content-Disposition'] ='attachment; filename =“%s.txt”'%p.uuid –

3

XSEND需要 response['X-Sendfile'] 的文件路径所以,你可以做

response['X-Sendfile'] = smart_str(path_to_file) 

这里,path_to_file是该文件的完整路径(而不仅仅是文件名) 结帐这个django-snippet

+0

我已经推荐代码:“response ['X-Sendfile'] = smart_str(f.name)”仍然没有,我需要使用除f.name以外的东西吗? – Callum

+0

它需要完整的路径,而不仅仅是'f.name' - 除非你在'f.name'中存储绝对路径? – karthikr

+0

NamedTemporaryFile创建绝对路径 –

1

可以有几个问题你的方法:

  • 文件的内容没有被刷新,加f.flush()为在上面的评论中提到
  • NamedTemporaryFile在关闭时会被删除,当您退出您的功能时可能会发生什么情况,因此网络服务器没有机会捡起它
  • 临时文件名可能是出于Web服务器被配置哪些路径使用

也许这将是更好地使用StreamingHttpResponse而不是创建临时文件和发送...

1
import urllib2; 
url ="http://chart.apis.google.com/chart?cht=qr&chs=300x300&chl=s&chld=H|0"; 
opener = urllib2.urlopen(url); 
mimetype = "application/octet-stream" 
response = HttpResponse(opener.read(), mimetype=mimetype) 
response["Content-Disposition"]= "attachment; filename=aktel.png" 
return response