我在服务器端有一个 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 文件下载它允许通过 OnSuccess 和 OnFailure 回调完成文件下载,从而提供“类似 Ajax”的体验,从而提供更好的用户体验。看看我的博客文章该插件解决的常见问题以及使用它的一些方法以及jQuery 文件下载的演示。这里是source
这是使用该插件的简单用例演示source与承诺。这演示页面还包括许多其他“更好的用户体验”示例。
$.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 方法更明确的控制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)