相关文章推荐
忧郁的海龟  ·  JS 实现 ...·  6 天前    · 
活泼的柚子  ·  blob转file ...·  6 天前    · 
直爽的烤红薯  ·  java ...·  6 天前    · 
奔放的钢笔  ·  render 函数基础 | ...·  1 年前    · 
腼腆的炒粉  ·  Caused by: ...·  1 年前    · 
 const downloadJsonFile = () => {
   var jStr = { hello: 'World' }
   var blob = new Blob([JSON.stringify(jStr, null, 2)], {type: 'application/json'})
   const link = document.createElement('a');
   const url = window.URL.createObjectURL(blob);
   link.href = url;
   link.download = `g.json`
   link.click();
   link.remove();

   Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是JavaScript原生格式的数据。

   Blob构造函数的参数可以是DomString,ArrayBuffer,Blob, ArrayBufferView对象。

   上面构造函数传递的就是DomString,就是字符串。但是我们请求服务器的获取到的二进制流,可以是blob类型,也可以是arraybuffer,一般我们会在请求的时候带上 responseType参数,可以设置为’blob’ 或者 ‘arraybuffer’。

浏览器下载文件(与server端交互,ajax请求返回二进制流。)

   服务端代码用的是egg.js,controller代码长这样:

 // 前提:附件test.pdf放在项目根目录下
 async downloadFile() {
   const { app, ctx } = this;
   const filePath = app.baseDir + '/test.pdf';
   const fileSize = fs.statSync(filePath).size;
   ctx.attachment(filePath);
   // 最好指定这个content-type,如果服务端没有指定,并且前端处理blob也没有指定文件后缀,那么默认是txt文件
   ctx.set('Content-type', 'application/pdf'); 
   const fileName = 'test.pdf';
   ctx.set('Content-Length', fileSize);
   ctx.set('Content-Disposition', `attachment; filename=${fileName}`);
   ctx.body = fs.createReadStream(filePath);

   前端发请求用的是axios,代码:

const downloadEvent = async () => { let res = await axios.get(`${SERVER_HOST}/downloadFile`, { withCredentials: true, // responseType: 'blob', key code responseType: 'arraybuffer', // blob 都是可行的, key code headers:{ 'Access-Control-Allow-Origin':'*', if (res) { const blob = new Blob([res.data]) // const zip = new Blob([data], { type: data.type }); // IE兼容性 if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob( blob, `test.pdf` } else { const link = document.createElement('a'); const url = window.URL.createObjectURL(blob); link.href = url; link.download="test.pdf"; link.click(); link.remove() 使用javascript blob 下载文件模拟浏览器下载文件(不与server端交互)   纯前端的模拟一个下载文件动作 const downloadJsonFile = () => { var jStr = { hello: 'World' } var blob = new Blob([JSON.stringify(jStr, null, 2)], {type: 'application/json'}) const link = document.createElem
需求背景:今天实现一个文件下载功能,因为要对下载者进行token鉴权,而token是携带在header里面的,所以一般的方法例如用a标签,或者el-link这些都满足不了要求,只能通过ajax的方式实现,搞了一个小时,现在把前后端代码贴出来。 后端代码,后端代码没有什么特殊的 @PostMapping("/downloadFile") public void downloadFile(@Valid @RequestBody FileDownload fileDownload, HttpServletResp
在简单的项目中下载文件的方法都是通过一个get请求下载文件,随着前后端分离,前端使用前端框架(vue,anglajs等)之类的node.js 通过异步请求来关联前后端,下载文件的时候使用get方式请求后端下载文件时,就显得不太合适。 下面介绍如何通过ajax异步请求下载一个zip压缩文件 前端发送一个ajax请求 var self = this; this.$http({ method:'post', var url = "${pageContext.request.contextPath}/exportExcel/exportMemberFile"; //实现Ajax下载文件 $.fileDownload(url, { (2)post请求, ‘application/x-www-form-urlencoded’,使用下面的方法或xhr原生 function exportData(api, params, encode) { var form = $('<form>'); //定义一个form表
导出function download() { var url = 'download/?filename=aaa.txt'; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以使用POST方式,根据接口 xhr.responseType = "blob"; // 返回类型blob
要实现Spring Boot和Ajax下载Excel文件,可以按照以下步骤进行: 1. 在Controller中创建一个方法,该方法将生成Excel文件并返回文件的字节数组。例如: ```java @GetMapping("/downloadExcel") public ResponseEntity<byte[]> downloadExcel() throws IOException { byte[] excelBytes = generateExcel(); // 生成Excel文件并返回字节数组 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", "data.xlsx"); // 设置文件名 headers.setContentLength(excelBytes.length); return new ResponseEntity<>(excelBytes, headers, HttpStatus.OK); 2. 在前端页面中,使用Ajax发送请求下载Excel文件。例如: ```javascript function downloadExcel() { $.ajax({ url: '/downloadExcel', type: 'GET', xhrFields: { responseType: 'blob' success: function(blob) { var link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = 'data.xlsx'; // 设置文件名 link.click(); 这里使用了responseType为blob的Ajax请求来接收Excel文件的二进制数据,并通过创建一个链接的方式下载文件