javascript - 通过 jQuery.Ajax 下载文件

标签 javascript jquery ajax jsp download

我在服务器端有一个 Struts2 操作用于文件下载。

<action name="download" class="com.xxx.DownAction">
    <result name="success" type="stream">
        <param name="contentType">text/plain</param>
        <param name="inputName">imageStream</param>
        <param name="contentDisposition">attachment;filename={fileName}</param>
        <param name="bufferSize">1024</param>
    </result>
</action>

但是,当我使用 jQuery 调用该操作时:

$.post(
  "/download.action",{
    para1:value1,
    para2:value2
    ....
  },function(data){
      console.info(data);
   }
);

在 Firebug 中,我看到数据是通过二进制流检索的。我想知道如何打开文件下载窗口让用户将文件保存到本地?

最佳答案

2019 年现代浏览器更新

这是我现在推荐的方法,但有一些注意事项:

  • 需要相对现代的浏览器
  • 如果文件预计非常大,您可能应该执行类似于原始方法(iframe 和 cookie)的操作,因为以下某些操作可能会消耗至少与正在下载的文件和/或其他有趣的 CPU 副作用。

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.blob())
  .then(blob => {
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    // the filename you want
    a.download = 'todo-1.json';
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
    alert('your file has downloaded!'); // or you know, something with better UX...
  })
  .catch(() => alert('oh no!'));

2012 年原始的基于 jQuery/iframe/Cookie 的方法

Bluish对此完全正确,您不能通过 Ajax 来完成此操作,因为 JavaScript 无法将文件直接保存到用户的计算机(出于安全考虑)。遗憾的是,将主窗口 URL 指向文件下载意味着您​​无法控制文件下载时的用户体验。

我创建了jQuery File Download它允许通过 OnSuccess 和 OnFailure 回调完成文件下载,从而提供“类似 Ajax”的体验,从而提供更好的用户体验。看看我的blog post关于该插件解决的常见问题以及使用它的一些方法以及 demo of jQuery File Download in action 。这是source

这是一个使用插件 source 的简单用例演示与 promise 。 demo page还包括许多其他“更好的用户体验”示例。

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });

根据您需要支持的浏览器,您可以使用 https://github.com/eligrey/FileSaver.js/与 jQuery 文件下载使用的 IFRAME 方法相比,它允许更明确的控制。

关于javascript - 通过 jQuery.Ajax 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29342282/

相关文章:

javascript - 在 $.ajax 调用中将附加数据添加到 jQuery 包装的对象数据中

javascript - 重复 jQuery ajax 请求

javascript - 我有一个未捕获的 ReferenceError : response is not defined exception when I am trying to get service

javascript - 从 Jquery HandsonTable() 获取 $_POST 到 php

javascript - 插入 Ajax 轮询

javascript - 使用 PHP/Javascript 测试网络速度

javascript - 为什么在javascript中引用对象的不存在属性不会返回引用错误?

javascript - .css() 函数不会为任何元素设置任何属性

javascript - 如何从 bootstrap-datepicker 获取更改的日期

javascript - FRP 复杂状态 - 不变性与性能