13

我正在尝试提供一个由某些内容生成的 txt 文件,但我遇到了一些问题。我创建了临时文件并使用 NamedTemporaryFile 编写了内容,并将 delete 设置为 false 以进行调试,但是下载的文件不包含任何内容。

我的猜测是响应值没有指向正确的文件,因此没有下载任何内容,这是我的代码:

    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
4

4 回答 4

21

您是否考虑过仅p.body通过以下response方式发送:

response = HttpResponse(mimetype='text/plain')
response['Content-Disposition'] = 'attachment; filename="%s.txt"' % p.uuid
response.write(p.body)
于 2013-04-03T14:35:59.413 回答
3

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

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

这里,path_to_file是文件的完整路径(不仅仅是文件名)检查这个django-snippet

于 2013-04-03T14:30:33.897 回答
1

您的方法可能存在几个问题:

  • 文件内容不必刷新,f.flush()如上面评论中所述添加
  • NamedTemporaryFile在关闭时被删除,当你退出你的功能时可能会发生什么,所以网络服务器没有机会拿起它
  • 临时文件名可能不在配置 Web 服务器发送使用的路径中X-Sendfile

也许最好使用StreamingHttpResponse而不是创建临时文件和X-Sendfile......

于 2013-04-03T14:43:55.687 回答
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 
于 2013-12-16T11:42:05.740 回答