工程WebApi:

点击按钮执行的handler

     exportClick() {
var
profile = {
content: this.state.profile,
type: MappingTypeForSevice.DomainMapping
};
if (this.props.viewType == ViewType.Edit)
profile = this.assembleProfileDto();
else
profile.content.id = this.props.mappingId != '' ? this.props.mappingId : this.id;
CommonFunction.exportClick(profile, this.state.mappingName);
};

CommonFunction.exportClick定义

 export const exportClick = (profile, mappingName) => {
MappingService.Downloadmapping(profile).then(
result => {
if (!result)
throw ("error");
export_raw(mappingName, result)
}
).catch(e => {
$$.error(`error: ${e}`);
});
};

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

export_raw函数定义(XML形式)

 var
export_raw = (name = '', data) => {
let
eleLink = document.createElement('a');
data = new Blob([data], { type: "text/xml" });
eleLink.style.display = 'none';
eleLink.download = name + '.xml';
if (window.navigator.msSaveOrOpenBlob) {
var
xml = name + '.xml';
navigator.msSaveOrOpenBlob(data, xml);
} else {
//let
// dataUrl = "data:;base64," + data;
//eleLink.href = dataUrl;
eleLink.href = URL.createObjectURL(data);
document.body.appendChild(eleLink);
eleLink.click();
document.body.removeChild(eleLink);
};
};

EXCEL文件返回

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

export_raw函数定义(EXCEL形式)

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

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

工程:.NetCore

controller:

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

js:

  handleExportButtonClick() {
var
self = this,
data = {};
data['sheetName'] = "";
data['assessments'] = this.assessments;
data['CohortNames'] = this.cohorts;
data['moduleCodes'] = this.moduleCodes;
data['qTypes'] = this.qTypes;
data['status'] = this.status;
$.ajax({
url: `${CommonUtil.getTargetUrlPrefix(SAComponents.COMPONENT_ASSESSMENTPRINTINGTRACKING)}/api/test/export`,
data: JSON.stringify(data),
method: 'POST',
processData: false,
contentType: 'application/json',
cache: false,
dataType: "text",
targetComponent: SAComponents.COMPONENT_ASSESSMENTPRINTINGTRACKING,
success: function (res) {
self.handleExportButtonClickCallBack('test', res);
console.log('success');
},
error: function (e) {
console.log(e);
},
headers: {
Authorization: "Bearer " + userProfileManager.getAccessToken()
},
});
};

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

base64:

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

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

Data Url

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

URL.createObjectURL()

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

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

js 文件下载的更多相关文章

  1. js文件下载及命名(兼容多浏览器)

    函数功能:实现主流浏览器的文件下载功能: 兼容性: >=IE10,Edge,chrome,firefox; 与后台的请求方式:GET请求,  url携带参数  url?id=123(隐藏文件真实 ...

  2. 安卓请求服务器js文件下载到本地,版本号就下载

    <?phpreturn array('CJ_V' => 'v0.15',) <script src="/js/reserve.js?<?=C('CJ_V')?> ...

  3. FileSaver.js 文件下载

    安装: npm install file-saver --save 或者(需下载FileSaver.js文件) <script src="path/FileSaver.js" ...

  4. js 文件下载 进度条

    js: /** * 下载文件 - 带进度监控 * @param url: 文件请求路径 * @param params: 请求参数 * @param name: 保存的文件名 * @param pro ...

  5. js文件下载

    因为公司后端忙得无法给批量下载的api,就我们前端自己把多张图片打包成zip下载,zip打包我们用的是jszip,下面是js实现下载的三种方法: 利用HTML download 属性 var a = ...

  6. js文件下载代码 import downloadjs from 'downloadjs'

    function logDownload(contribution_id) { setTimeout(function () { $.ajax({ url: "/ajax/Wallpaper ...

  7. node.js 文件下载

    //下载参数 var http = require("http"); var fs = require("fs"); var path = require(&q ...

  8. js 文件下载 兼容ie

    前置条件:后台接口返回二进制流文件 一.设置前端请求的的 responseType: 'blob' 二.接收请求数据并调用下载 var content = res.data // 接口返回的二进制流v ...

  9. js 文件下载进度监控

    var xhr = new XMLHttpRequest(); xhr.open('GET', '文件地址.mp4'); xhr.setRequestHeader("Content-type ...

随机推荐

  1. 关于Virtual的英语含义

    不知道有人注意没有,virtual的英语含义是:实际的,事实上,实质上.但是在计算机英语内却表示:虚拟的意思.比如:virtual memery 虚拟内存,virtual reality 虚拟现实. ...

  2. bash脚本输入密码不回显问题的解决方法

    编写一个bash脚本时,需要用户输入一个密码,方可继续后续流程,但是又要保证用户输入的密码不会被别人看到,因此排除了通过参数将密码传入脚本的方案 不绕圈子,揭晓答案:设置终端状态为“字符不回显”(如果 ...

  3. mybatis 一二事(1) - 简单介绍

    mybatis呢是一个orm数据库框架,非常适合新人学,门槛相对较低 本人呢曾经是先做的hibernate,后接触的mybatis,接触mabatis前我比较抵触,为啥呢, 当时喜欢hibernate ...

  4. testbench常用语句 很详细相当实用

    内容 与可综合Verilog代码所不同的是,testbench Verilog是在计算机主机上的仿真器中执行的.testbench Verilog的许多构造与C语言相似,我们可在代码中包括复杂的语言结 ...

  5. 【Android】6.1 Toast(信息提示框)

    分类:C#.Android.VS2015: 创建日期:2016-02-08 一.简介 Toast用于向用户显示一些帮助或者提示信息.前面我们已经多次用到它,这里只是系统地将其总结一下,并演示它的各种基 ...

  6. Django——model基础

      ORM 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 创建表(建立模型) 实例:我们来假定下 ...

  7. 使用jquery插件validate制作的表单验证案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Python以不可见字符作为列分割符

    # -*- coding: utf-8 -*- import sys import time CTRL_A='\x01' CTRL_B='\x02' thedate = '' thetime = '' ...

  9. java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())

    JAVA中有3种方式可以终止正在运行的线程 ①线程正常退出,即run()方法执行完毕了 ②使用Thread类中的stop()方法强行终止线程.但stop()方法已经过期了,不推荐使用 ③使用中断机制i ...

  10. centos修改ip mac等

    CentOS修改mac http://www.haowlan.com/jishuluntan/488.html CentOS 修改IP地址, DNS, 网关 http://www.21andy.com ...