下载文件作为响应

时间:2014-07-18 13:43:07

标签: jquery ajax django

我正在尝试实现以下目标:在客户端,使用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==

在这种情况下附件的内容

有关我做错的任何建议吗?

3 个答案:

答案 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")
});

jsfiddle http://jsfiddle.net/guest271314/Xd4zk/