查阅网上关于JavaScript实现下载文件功能,主要有几种方式:

1. window.open(url)    这是最差劲最不负责任的做法,因为会下载会弹出白页面

2. 构造form表单,form.submit()    这种方式有一个问题:不能加入等待对话框

3. 使用XMLHttpRequest,获取response 实现下载, 但是有一个小问题:后台header中filename不能直接使用

以下针对第三种进行改进:

1. 前端代码

download: function(url, params, fileName) {var len, i = 0,temp, input, form, key;//处理参数var urlParams = [];if (isA(params)) {for (len = params.length; i < len; i++) {temp = params[i];urlParams.push(temp.key + "=" + temp.value);}} else if (isO(params)) {for (key in params) {temp = params[key];urlParams.push(key + "=" + temp);}} else if(isS(params)) {params = Utilities.parseQuery(params);for (key in params) {temp = params[key];urlParams.push(key + "=" + temp);}}//显示等待Dialogs.showWait('正在下载中,请稍候...');var xmlRequest = new XMLHttpRequest();xmlRequest.open("POST", url, true);xmlRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");xmlRequest.responseType = "blob";xmlRequest.onload = function (oEvent) {if((xmlRequest.status >= 200 && xmlRequest.status < 300) || xmlRequest.status === 304) {if(!fileName) {//从header中获取fileName = decodeURI(xmlRequest.getResponseHeader('filename'));}console.log(fileName);//校验是否下载参数var content = xmlRequest.response;if(!fileName || fileName === 'null') {var myReader = new FileReader();myReader.addEventListener("loadend", function(e){var msg = e.srcElement.result;Dialogs.showWarn(msg);});myReader.readAsText(content);return;}//数据转换为文件下载var elink = document.createElement('a');elink.download = fileName || 'demo.xlsx';elink.style.display = 'none';var blob = new Blob([content]);elink.href = URL.createObjectURL(blob);document.body.appendChild(elink);elink.click();document.body.removeChild(elink);//关闭等待Dialogs.hide();} else {Dialogs.showWarn('下载失败');}};try {//发送参数字符串, 但是formData需要后台支持xmlRequest.send(urlParams.join('&'));} catch (e) {Dialogs.showWarn('发送下载请求失败');console.error('发送失败',e);}},

后台代码:

需要设置response.addHeader("filename", StringUtils.urlEncode(fileName + ".xlsx"));

@RequestMapping(value = "/download.json", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic String downloadList(RequestParamRequest requestParamRequest,HttpServletRequest request,HttpServletResponse response) {其他逻辑省略....response.setContentType("application/octet-stream");response.addHeader("Content-disposition", "attachment; filename=" + new String((fileName + ".xlxs").getBytes("utf-8"), "ISO8859-1"));//在header中设置中文文件名,需要编码,前端需要获取response.addHeader("filename", StringUtils.urlEncode(fileName + ".xlsx"));OutputStream out = null;try {out = response.getOutputStream();workbook.write(out);} finally {IOUtils.closeQuietly(out);}
}

javascript XMLHttpRequest实现下载文件相关推荐

  1. javascript 检测 header下载文件--插件

    原理:下载文件时设置一个cookie,客户端利用js间隔性检测cookie,如果检测到则服务端对下载的文件处理完毕,然后通知客户端 http://johnculviner.com/post/2012/ ...

  2. PC端下载文件到本地

    最新更新时间:2021年08月12日14:42:40 <猛戳-查看我的博客地图-总有你意想不到的惊喜> 本文内容:前端开发过程中,经常会遇到下载文件到本地的需求,用户点击一个按钮,浏览器会 ...

  3. ajax实现下载文件进度条及方法详解

    javascript使用ajax下载文件进度条实现 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&qu ...

  4. 使用Javascript / jQuery下载文件

    本文翻译自:Download File Using Javascript/jQuery I have a very similar requirement specified here . 我在这里指 ...

  5. javascript下载文件几种方式,接收后台返回流下载或直接下载文件

    目录 1 javascript下载文件7中方式 1.1 window.location.href下载 1.2 window.location下载 1.3 iframe下载 1.4 form表单的形式下 ...

  6. JavaScript实战篇 -ajax方式实现js打包下载文件

    一.问题描述 在我们日常开发中,会遇到批量下载方面的问题;如上图所示,我们要批量下载图片,接下来我们就模拟实现这个功能,并将下载文件打包下载; 二.准备工作 2.1 JSZip JSZip 是一个 j ...

  7. js下载文件,javascript下载文件,FileSaver.js,页面元素保存成文件

    js下载文件,javascript下载文件,FileSaver.js,页面元素保存成文件 ================================ ©Copyright 蕃薯耀 2020-07 ...

  8. python单击url下载网页文件_使用不带url的python脚本从网页下载文件,调用onClick函数 - javascript...

    有一个网页带有链接"单击下载",单击该链接可以下载文件. 我可以通过转到网页并单击此链接来手动下载此文件,但是我需要通过python脚本下载此文件. 如果我看到源代码,则可以看到锚 ...

  9. 如何用 JavaScript 下载文件

    简介 我们知道,下载文件是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的 url 来实现下载功能,但是这种用户体验非常不好. 幸好,HTML 5 里面 ...

  10. [Javascript]XMLHttpRequest对象实现下载进度条

    摘要 可以通过设置一个XMLHttpRequest对象的responseType属性来改变一个从服务器上返回的响应的数据类型.可用的属性值为空字符串 (默认), "arraybuffer&q ...

最新文章

  1. python代码读取文件并将文件反序存入另外一个文件
  2. thinkphp查询
  3. 思科发布安全大数据分析架构 OpenSOC
  4. php js 异步上传图片,javascript实现异步图片上传方法实例
  5. linux系统如何打开python_手把手教你在Linux系统下使用Python虚拟环境
  6. rocksdb原理_[转]Rocksdb Compaction原理
  7. 【计算机网络复习】1.1.4 时延、时延带宽积、RRT和利用率
  8. Django之Model操作
  9. java : NoSuchMethodError: org.codehaus.jackson.JsonNode.asInt()
  10. Pandas dtypes
  11. 系统集成项目管理工程师教程重点、笔记和试题大全
  12. element 日期选择器el-date-picker 月份/日期范围控制
  13. Pytorch 学习率衰减 之 余弦退火与余弦warmup 自定义学习率衰减scheduler
  14. 2020,那些惊艳我的产品迭代
  15. Oracle(四)Oracle 函数
  16. 如何进行自动化测试?提高测试效率,缩短开发周期。
  17. 项目工作总结 (转)
  18. 惊喜开学季,教你如何在人工智能时代站稳脚跟!
  19. C语言 依次将10个整数输入,要求输出其中最大的整数
  20. JavaScript表单验证及注册界面

热门文章

  1. 什么是java实例化?举例说明
  2. GBase 8a数据库Hash分布表和随机分布表hash索引的区别
  3. 数据分析师—Excel实战篇
  4. visa虚拟卡生成器_虚拟信用卡。亲,你懂了吗?
  5. 闫啸的发明和发现20220901
  6. E4A直播盒子APP源码搭建教程之——后台源码篇
  7. (详细图解)VS2017安装教程
  8. 研磨设计模式之《模板方法模式template method》
  9. 我的世界光影mod怎么用_《我的世界》RTX beta 版视频体验:仿佛打破了次元壁
  10. c语言int占几个字节 vc,int类型占几个字节