我正在尝试实现以下目标:在客户端,使用Jquery / Ajax,我向我的Django服务器发出Post请求。在服务器端,我得到这个请求,提取参数,根据我确定文件路径,然后我构建一个HttpResponse,目的是让浏览器下载该文件。
然而,这种情况并没有发生,尽管我在回复中看到附件的内容。
响应构建为:
response = HttpResponse(file(path_to_file))
response['Content-Type'] = 'application/force-download'
response['Content-Length'] = os.path.getsize(path_to_file)
response['Content-Disposition'] = 'attachment; filename=\"request.txt\"'
response['Accept-Ranges'] = 'bytes'
return response
这是与firebug一起看到的Response标头
Accept-Ranges bytes
Connection keep-alive
Content-Disposition attachment; filename=grequest.txt
Content-Length 228
Content-Type application/force-download
Date Fri, 18 Jul 2014 14:55:33 GMT
Server nginx/1.4.4
Set-Cookie sessionid=41602cd107bbddb41e8884a88c9035c0; Path=/
Vary Authorization, Cookie
这是响应内容,用firebug看到
eyJub2RlSUQiOiIwMmI1ODMtYjNhMTljLWM1MjkwYi05YzAwIiwiYWxpYXMiOiJsb2NhbGhvc3QiLCJkbnNOYW1lIjoibG9jYWxob3N0IiwiY2hhc3Npc1NlcmlhbCI6IiIsImFjdGl2YXRpb25zIjpbeyJhY3RpdmF0aW9uSUQiOiI3RjE3LUZFRUQtMTI5Ny1GOTUyIiwicXVhbnRpdHkiOiIzIn1dfQ==
在这种情况下附件的内容
有关我做错的任何建议吗?
答案 0 :(得分:0)
对您的代码进行一些调整。试试这个......
response = HttpResponse(file(path_to_file).read(), mimetype='application/force-download')
另外,你为什么要逃避
中的双引号response['Content-Disposition'] = 'attachment; filename=\"request.txt\"'
答案 1 :(得分:0)
您无法使用Ajax从服务器下载文件。出于安全原因,不允许Javascript与客户端的硬盘进行交互,因此无法将响应保存到磁盘。
常见的解决方法是要么包含隐藏的iframe,要么使用Javascript设置src
属性,要么使用Javascript设置window.location.href
。两种方法都应该在不离开当前页面的情况下提示用户保存对话框。
答案 2 :(得分:0)
尝试
HTML
<a id="download" download="" href="">download</a>
JS
$(function() {
var request = function (url, filename) {
/* var file = {json : JSON.stringify([ "eyJub2RlSUQiOiIwMmI1ODMtYjNhMTljLWM1MjkwYi05YzAwIiwiYWxpYXMiOiJsb2NhbGhvc3QiLCJkbnNOYW1lIjoibG9jYWxob3N0IiwiY2hhc3Npc1NlcmlhbCI6IiIsImFjdGl2YXRpb25zIjpbeyJhY3RpdmF0aW9uSUQiOiI3RjE3LUZFRUQtMTI5Ny1GOTUyIiwicXVhbnRpdHkiOiIzIn1dfQ=="])}; */
$.ajax({
beforeSend : function(jqxhr, settings) {
jqxhr.filename = filename;
},
url : url,
type : "POST",
dataType : "text json",
/* data : file, */
success : function(data, textStatus, jqxhr) {
$("a#download").attr({
"download" : jqxhr.filename,
"href" : "data:text/plain;base64," + data /* data[0] */
}).get(0).click();
}
});
};
request("/echo/json/", "request.txt")
});