前端发送ajax【get/post】请求,后端生成excel文件,最后用response输出文件流,没有报错也没有文件下载提示。
遇到过这个问题的仍是很多,问题出在ajax自己,解决方法和缘由也都找到。html
缘由:文件的下载是以二进制形式进行的,ajax没法解析后台返回的文件流,因此没法处理二进制流response输出来下载文件前端
ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,ajax无法解析后台返回的文件流,因此没法处理二进制流response输出来下载文件。
ajax的返回值类型是json,text,html,xml类型,或者能够说ajax的接收类型只能是string字符串,不是流类型,因此没法实现文件下载。但用ajax仍然能够得到文件的内容,该文件将被保留在内存中,没法将文件保存到磁盘。
这是由于JavaScript没法和磁盘进行交互,不然这会是一个严重的安全问题,js没法调用到浏览器的下载处理机制和程序,会被浏览器阻塞。
1)使用window.location.href=dataUrl;就能够实现。ajax
window.location.href=basePath+'invoiceFormBillAttachAction/downloadAttaches.do?ID='+ID+'&REMARK='+REMARK;
2) 使用隐藏iframe实现无刷新下载文件json
<a href="#" onclick="downloadFile()">download</a> <iframe id="ifile" style="display:none"></iframe> function downloadFile(){ var dom=document.getElementById('ifile'); dom.src="http:xxxx.com"; }
3) 分装form表单请求后端
download() { if (this.cloudDiskIds.length == 0) { alert ("请选择要下载的文件!") return } if (this.cloudDiskIds.length > 1) { alert ("只能选择一个文件!") return } // this.formData.fileName = this.cloudDiskList[0].fileName; // this.formData.filePath = this.cloudDiskList[0].filePath; // alert (this.cloudDiskIds[0]) // 请求地址 var url = "http://localhost:8080/wingCloud/customer/download"; // 分装form表单 var form = $("<form></form>").attr("action", url).attr("method", "post"); // 封装参数 form.append($("<input></input>").attr("type", "hidden").attr("name", "id").attr("value", this.cloudDiskIds[0])); // form.append($("<input></input>").attr("type", "hidden").attr("name", "filePath").attr("value", this.formData.filePath)); // 提交 form.appendTo('body').submit().remove(); }