js 文件下载

摘要:
结果)5throw;6export_ raw7}8).捕获;11}; 后台返回的结果是字符串,xml是内容导出_ Raw函数定义1var2export_ Raw=˃{3let4eleLink=document.createElement('a');5data=newBlob;6eleLink.style.display='none';7eleLink.download=name+'.xml';8if{9var10xml=name+'.xml';11navigator.msSaveOrOpenBlob;12}其他{13//let14//dataUrl=“data:;base64,”+数据;15//eleLink.href=dataUrl;16eleLink.href=URL.createObjectURL;17document.body.appendChild;18eleLink.click();19文档.body.removeChild;20}; 21}; EXCEL文件返回haha,这意味着EXCEL文件是特殊的~export_ Raw函数定义1export_ Raw{2let3eleLink=document.createElement('a');4eleLink.style.display='none';5eleLink.download=name+'.xls';6data=“data:;base64,”+data;7if{8//ifbrowsersIE9letblob=this.dataURLtoBlob;10navigator.msSaveOrOpenBlob;11}其他{12eleLink.href=data;13document.body.appendChild;14eleLink.click();15document.body.removeChild;16}; 17}; 1dataURLtoBlob==˃{2var3arr=dataurl.split(','),4mime=arr[0]匹配(/:(.*?

工程WebApi:

点击按钮执行的handler

 1     exportClick() {
 2         var
 3             profile = {
 4                 content: this.state.profile,
 5                 type: MappingTypeForSevice.DomainMapping
 6             };
 7         if (this.props.viewType == ViewType.Edit)
 8             profile = this.assembleProfileDto();
 9         else
10             profile.content.id = this.props.mappingId != '' ? this.props.mappingId : this.id;
11         CommonFunction.exportClick(profile, this.state.mappingName);
12     };

CommonFunction.exportClick定义

 1 export const exportClick = (profile, mappingName) => {
 2     MappingService.Downloadmapping(profile).then(
 3         result => {
 4             if (!result)
 5                 throw ("error");
 6             export_raw(mappingName, result)
 7         }
 8     ).catch(e => {
 9         $$.error(`error: ${e}`);
10     });
11 };

后台返回result是一个字符串,xml为内容

js 文件下载第1张

export_raw函数定义(XML形式)

 1 var
 2     export_raw = (name = '', data) => {
 3         let
 4             eleLink = document.createElement('a');
 5         data = new Blob([data], { type: "text/xml" });
 6         eleLink.style.display = 'none';
 7         eleLink.download = name + '.xml';
 8         if (window.navigator.msSaveOrOpenBlob) {
 9             var
10                 xml = name + '.xml';
11             navigator.msSaveOrOpenBlob(data, xml);
12         } else {
13             //let
14             //    dataUrl = "data:;base64," + data;
15             //eleLink.href = dataUrl;
16             eleLink.href = URL.createObjectURL(data);
17             document.body.appendChild(eleLink);
18             eleLink.click();
19             document.body.removeChild(eleLink);
20         };
21     };

EXCEL文件返回

js 文件下载第2张

哈哈,意思意思得了,EXCEL文件比较特殊~

export_raw函数定义(EXCEL形式)

 1 export_raw(name = '', data) {
 2     let
 3         eleLink = document.createElement('a');
 4     eleLink.style.display = 'none';
 5     eleLink.download = name + '.xls';
 6     data = "data:;base64," + data;
 7     if (window.navigator.msSaveOrOpenBlob) {
 8         // if browser is IE 
 9         let blob = this.dataURLtoBlob(data);
10         navigator.msSaveOrOpenBlob(blob, name + '.xls');
11     } else {
12         eleLink.href = data;
13         document.body.appendChild(eleLink);
14         eleLink.click();
15         document.body.removeChild(eleLink);
16     };
17 };
 1     dataURLtoBlob = (dataurl) => {
 2         var
 3             arr = dataurl.split(','),
 4             mime = arr[0].match(/:(.*?);/)[1],
 5             bstr = atob(arr[1]), n = bstr.length,
 6             u8arr = new Uint8Array(n);
 7         while (n--) {
 8             u8arr[n] = bstr.charCodeAt(n);
 9         }
10         return new Blob([u8arr], { type: mime });
11     };

 这里涉及到了data url跟URL.createObjectURL两种方式创建下载链接。

工程:.NetCore

controller:

1       [HttpPost("export")]
2         public async Task<IActionResult> ExportTimeslot([FromBody] ExportTimeslotsCommand command)
3         {
4             command.SheetName = TimeslotExportSheetName;
5             var result = await _mediator.Send(command);
6             var fileStream = System.IO.File.ReadAllBytes(result);
7             return Request.OK(fileStream); //文件流
8             //return File(fileStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", result.ToString() + ".xlsx");//文件
9         }

js:

 1  handleExportButtonClick() {
 2         var
 3             self = this,
 4             data = {};
 5         data['sheetName'] = "";
 6         data['assessments'] = this.assessments;
 7         data['CohortNames'] = this.cohorts;
 8         data['moduleCodes'] = this.moduleCodes;
 9         data['qTypes'] = this.qTypes;
10         data['status'] = this.status;
11         $.ajax({
12             url: `${CommonUtil.getTargetUrlPrefix(SAComponents.COMPONENT_ASSESSMENTPRINTINGTRACKING)}/api/test/export`,
13             data: JSON.stringify(data),
14             method: 'POST',
15             processData: false,
16             contentType: 'application/json',
17             cache: false,
18             dataType: "text",
19             targetComponent: SAComponents.COMPONENT_ASSESSMENTPRINTINGTRACKING,
20             success: function (res) {
21                 self.handleExportButtonClickCallBack('test', res);
22                 console.log('success');
23             },
24             error: function (e) {
25                 console.log(e);
26             },
27             headers: {
28                 Authorization: "Bearer " + userProfileManager.getAccessToken()
29             },
30         });
31     };

以文件形式反回,可以利用base64进行下载,当然在浏览器里也可以看到excel文件:

base64:

1 data:;base64,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

js 文件下载第3张

这种方式适用不能通过get请求时需要post请求时发送复杂的参数。get请求场景可以将controller直接反回文件,前台利用window.open()进行下载。

Data Url

这里用的是base64,base64是一种标准的算法,在JavaScript中可以将任何变量的值转化成base64的形式(这里excel文件返回的就是base64形式),这里用data url形式进行地址复制。

URL.createObjectURL()

创建url用的,接受参数blob或者file

针对这几个知识点。单独提出来进行总结吧~

免责声明:文章转载自《js 文件下载》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决ueditor二次加载(getEditor)加载失败的问题eclipse server Runtime Environment 环境配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js中window对象详解以及页面跳转

1.window.top.window.location= "index.asp"; 2.window.top.location.href="index.asp" 3.window.top.location.replace("index.asp"); 4.window.navigate("index.asp"); 5.windows.open()//新窗口...

用js把数据从一个页面传到另一个页面

打开支付宝首页搜索: 4046160(可保存下来,每天可领一次) 领取方式,一定要点击 立即领取 按钮 这个才是金额比较大的余额宝红包。 红包平均为 3-5块 ,每天可领一次,有效期三天,必须上一次领的用了才可以领取下一个。 使用方法: 淘宝购物、门店付款、个人收款码、水电煤缴费、还信用卡都可以,但是 必须使用余额宝支付,付款金额大于等于红包就可以。 重...

【译】Js基础运行机制

一、js的工作原理:引擎、运行时与调用栈概述 JavaScript引擎的一个流行示例是Google的V8引擎。比如,V8引擎用于Chrome和Node.js。 该引擎包括两个主要组件:*内存堆-这是内存分配的地方*调用堆栈-这是代码执行时堆栈帧的位置 运行时浏览器中有几乎所有JavaScript开发人员都在使用的API(例如“ setTimeout”)。...

JS实现“隐藏与显示”功能(多种方法)

1,通过按钮实现隐藏与显示: 这个是通过按钮点击实现的隐藏与显示,具体代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47...

关于a标签不能调用js方法的小细节,你注意到了么?

在我们做后台删除的时候,当点击删除标签时,你希望弹出一个友好的提示框!比如这样: 那代码应该怎样写呢?向下面这样? <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script> wi...

js遍历json数据

先看看json返回的数据结构: 我需要遍历取出bookreno 与 title 加载到页面容器中去 首先我要取到recommendedBookList 字典结构数据,然后遍历反射到相应对象的属性 主方法这样写: $(d.recommendedBookList).each(function(index,item){ //index指下标//item指代对...