JavaScript:如何通过AJAX打开返回的文件

时间:2012-06-12 22:59:04

标签: javascript jquery download

这类似于:How to open a file using JavaScript?

目标:在图像的双击

上检索/打开文件
function getFile(filename){
   // setting mime this way is for example only
   var mime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';

   jQuery.ajax({ url      : 'get_file.pl',
                 data     : {filename:filename}, 
                 success  : function(data){
                               var win = window.open('','title');
                               win.document.open(mime);
                               win.document.write(data);
                               win.document.close();
                            }
               });
}

jQuery('#imgID').dblclick(function(){ 
   getFile('someFile.docx');
});

我正在做这件事,但我认为上述内容适用于文本文件,但不适用于二进制文件。是否有适当的插件?理想的是在浏览器(或应用程序)中打开文件,而不是下载,但我怀疑这是一个梦想。如果必须使用保存/打开对话框下载文件,那没关系。


编辑:

我忘记提及的一条信息是我希望这是一个POST请求。这就是我开始研究AJAX的部分原因。我已经看到了创建表单/ iframe来做类似事情的变通办法,但我一直在寻找一个更好的返回信息处理程序。

1 个答案:

答案 0 :(得分:5)

对我来说,没有理由通过AJAX这样做。只需打开 get_file.pl?filename = ... 的新窗口,让浏览器处理它。如果用户有一个能够处理 get_file.pl 发送的Content-Type的插件,则会显示该文件;否则,它应该像任何其他文件一样下载。

function getFile(filename) {
   window.open('get_file.pl?filename=' + filename,'title');
}

jQuery('#imgID').dblclick(function() { 
   getFile('someFile.docx');
});

修改:如果您希望POST加入您的脚本,you can do it加上一些<form> hackery:

function getFile(filename) {
    var win = 'w' + Math.floor(Math.random() * 10000000000000);
    window.open('', win,'width=250,height=100');
    var f = $('<form></form>')
            .attr({target: win, method:'post', action: 'get_file.pl'})
            .appendTo(document.body);

    var i = $('<input>')
            .attr({type:'hidden',name:'filename',value:filename})
            .appendTo(f);

    f[0].submit();
    f.remove();
}

当然,这有些愚蠢,因为用开发者工具隐藏你的数据不会“窥探”。如果您的文件名确实是敏感的,请向客户端发出访问令牌,并在服务器脚本中查找数据。