2013-04-03 120 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