【问题标题】:JavaScript: How to open a returned file via AJAXJavaScript:如何通过 AJAX 打开返回的文件
【发布时间】:2012-06-12 22:59:04
【问题描述】:

这类似于: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 来执行类似操作的变通方法,但我正在寻找返回信息的更好处理程序。

【问题讨论】:

  • 据我所知,浏览器会阻止应用程序的直接执行(我相信出于安全目的),除非浏览器上安装了插件(如 flash、adobe reader 等),或者分配了处理程序(如磁铁链接)。否则,它只会让您保存文件并手动打开它。
  • 与您链接的类似问题有什么不同?
  • @Bergi:好问题。 (1) 我链接到的问题是使用原型,在我的示例中我使用的是 jQuery;我不确定返回的对象与他们的 AJAX 请求是否有区别,但我认为 jQuery 的 data 返回文本/字符串。 (2) 我可能没有指定一个关键细节,我想避免 GET 请求。
  • @Bergi:再说一次,我链接到的页面中的答案是处理responseText,所以我想它们在这方面是相似的;然而,这个问题是近 3 年前提出的,从那时起,javascript 发生了很大变化,尤其是随着 HTML5 的广泛采用。

标签: javascript jquery download


【解决方案1】:

在我看来,没有理由通过 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();
}

当然,这有点愚蠢,因为使用开发人员工具无法“窥探”您的数据。如果您的文件名确实很敏感,请向客户端发出访问令牌,并在您的服务器脚本中查找数据。

【讨论】:

  • 能否通过 POST 请求打开新窗口?通常不建议这样做,但我们可能希望隐藏一些数据以防窥探。
  • 不,window.open 不支持 POST。用户可以看到所有数据,但如果您不希望它显示在地址栏中,您可以使用 cookie 进行传输。
  • 好的,你可以POST到这样的窗口,没错。
  • 我仍然希望有一个更好的方法,不带 Flash 或表单/iframe 控件,但我想这可以做到。我怀疑 HTML5 可能有更好的文件处理技术。
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2013-12-02
  • 2012-10-27
  • 1970-01-01
相关资源
最近更新 更多