ajax下载文件的坑
2023-09-27 14:23:13 时间
ajax是不能下载文件的,要么用form,要么用跳转
function openExportTabs() { let exportUrl = "${webRoot}/report/totalityDataReportExport"; if (!$("input[name='startTime']").val() || !$("input[name='endTime']").val()) { alert("开始时间或者结束时间不能为空!"); return; } let startTime = $("input[name='startTime']").val(); let endTime = $("input[name='endTime']").val(); let busiFlag=$("#busiFlag").val(); let url = exportUrl+"?startTime=" + startTime + "&endTime=" + endTime+"&busiFlag="+busiFlag; window.location.href=url; /* let result = ajaxUtil.get(url, ""); if (result == "error") { alert("操作出现异常"); return false; }*/ }
原因:
Ajax下载文件的这种方式本来就是禁止的。出于安全因素的考虑,javascript是不能够保存文件到本地的,
所以ajax考虑到了这点,只是接受json,text,html,xml格式的返回值,二进制的返回格式就会抛出这个异常。
因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,
然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。
文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。
解决方法:
1、用window.open() 或 window.location.href():
2、可以直接使用a标签实现文件下载:
<a href=”下载地址”>点击下载</a>
或
var aLink = document.createElement('a');
aLink.download = "文件名";
aLink.href = "文件url地址";
document.body.appendChild(aLink);
aLink.click();
document.body.removeChild(aLink);
3、可以使用jquery创建表单并提交实现文件下载:
var form = $("<form>");
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do");
var input1 = $("<input>");
input1.attr("type","hidden");
input1.attr("name","strZipPath");
input1.attr("value",strZipPath);
$("body").append(form);
form.append(input1);
form.submit();
form.remove();
4、使用隐藏iframe或新窗体解决:
export const downloadFile = (url) => {
const iframe = document.createElement("iframe");
iframe.style.display = "none"; // 防止影响页面
iframe.style.height = 0; // 防止影响页面
iframe.src = url;
document.body.appendChild(iframe); // 这一行必须,iframe挂在到dom树上才会发请求
// 5分钟之后删除(onload方法对于下载链接不起作用,就先抠脚一下吧)
setTimeout(()=>{
iframe.remove();
}, 5 * 60 * 1000);
}
这个可以实现一次下载多个文件。
相关文章
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
- 【转】文件下载之断点续传(客户端与服务端的实现)
- Python递归文件夹遍历所有文件夹及文件
- 无法打开输入文件“optimized.lib” 编译osgEarth2.8+VS2013+CMake3.4.0在Release版本的问题
- [转]SpringMVC单文件上传、多文件上传、文件列表显示、文件下载
- 我是怎么做到开源系统中的文件上传等功能的?
- 【用ddt思想重构项目】Selenium使用xlrd模块读取excel文件、使用pytest参数化实现ddt
- mysql数据导出为excel文件
- 两台Linux系统之间传输文件的几种方法
- LINUX文件权限
- C语言:文件操作(2)
- Python 网络教程大全之 04 如何获取url下载文件的大小?
- 大数据学习——下载集群根目录下的文件到E盘
- Linux下如何使用 wget 下载文件?
- reset.css文件下载及剖析
- 《深入解析sas:数据处理、分析优化与商业应用》一3.6 将数据集写出到外部文件
- python库 —— gym retro 的 ROMs文件下载地址
- Python实现下载文件的三种方法
- idhttpserver 下载文件
- ISE 工具下Flash芯片找不到时如何下载mcs文件
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载
- 【数据库学习】——【汇总】MySQL数据库下载与安装(Msi文件安装和免安装版本)、Navicat下载与安装