后台二进制文件 在前台下载方法总结

总结下实际开发过程中使用过的文件下载方法:

刚开始接触$.ajax()时 欣喜若狂,以为所有的异步交互都可以用它来操作,直到流文件。具体的场景是:

 后台操作文件 ,以二进制流的形式,返回到前台(我实际的场景是导出Excel文件)
context.Response.BinaryWrite(二进制数组);
 

首先想到的是通过$.ajax来进行操作,因为和后台交互的参数很多,它的参数形式可以用键值对对象的形式,很方便,

但是怎么操作都不行,不报错,但是文件就是不能下载,又想到设置dataType的形式,发现没文件流的形式,心中

一万个…….

废话少说,总结方法:

(1)通过a标签的形式,应该可以满足大多的需求。

就是通过设置href属性,点击a标签,就可以下载成功。PS:a的html5中download的属性,可以直接重命名文件。

  

固定的:
<a download="data.xls" href="file.ashx?paramone=canshuyi"> </a>
动态的:
<button type="button" onclick="download()">导出</button> 
function download() { var a = document.createElement('a'); var url = 'download/?filename=aaa.txt'; var filename = 'data.xlsx'; a.href=url; a.download = filename; a.click() } 

 (2)通过window.location

 window.location = "../handler/OperateExcel/OutExcelCom.ashx?tablename=canshuyi"

 (3)创建iframe

                    var elemIF = document.createElement("iframe");
                    elemIF.src = "../lib/TemplateCollection/" + ExcelName + ".xls";
                    elemIF.style.display = "none";
                    document.body.appendChild(elemIF);

 以上三种方法指向后台返回文件流的方法,或者具体的实际文件路径,都可以下载文件。

(4)HTML5中blob对象

很多人都在说第这种方法可以满足,其实是错误方式        
<button type="button"  οnclick="download()">导出</button>
function download() { var url = 'download/?filename=aaa.txt'; $.get(url, function (data) { console.log(typeof(data)) blob = new Blob([data]) var a = document.createElement('a'); a.download = 'data.xlsx'; a.href=window.URL.createObjectURL(blob) a.click() }) }

 这种方式保存的文件是不能打开的,console.log(typeof(data))会看到是string类型(乱码的),原因是jquery将返回的数据转换为了string,不支持blob类型。

正确方式

<button type="button"  οnclick="download()">导出</button>
function download() { var url = 'download/?filename=aaa.txt'; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以使用POST方式,根据接口 xhr.responseType = "blob"; // 返回类型blob // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑 xhr.onload = function () { // 请求完成 if (this.status === 200) { // 返回200 var blob = this.response; var reader = new FileReader(); reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href reader.onload = function (e) { // 转换完成,创建一个a标签用于下载 var a = document.createElement('a'); a.download = 'data.xlsx'; a.href = e.target.result; $("body").append(a); // 修复firefox中无法触发click a.click(); $(a).remove(); } } }; // 发送ajax请求 xhr.send() }

 

参考:

https://my.oschina.net/watcher/blog/1525962

http://www.cnblogs.com/cdemo/p/5225848.html

转载于:https://www.cnblogs.com/huangshuqiang/p/7853606.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二进制流转化为Base64可以使用不同的方法,下面是几种常见的方法方法一:使用FileReader对象 可以使用FileReader对象的readAsDataURL方法二进制流转化为Base64编码的字符串。示例代码如下: ```javascript function convertBinaryToBase64(binary) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => { resolve(reader.result); }; reader.onerror = reject; reader.readAsDataURL(binary); }); } // 调用方法 const binaryData = ...; // 二进制流数据 convertBinaryToBase64(binaryData) .then(base64Data => { console.log(base64Data); }) .catch(error => { console.error(error); }); ``` 方法二:使用btoa函数 可以使用btoa函数将二进制流转化为Base64编码的字符串。示例代码如下: ```javascript function convertBinaryToBase64(binary) { let binaryString = ''; const bytes = new Uint8Array(binary); for (let i = 0; i < bytes.length; i++) { binaryString += String.fromCharCode(bytes\[i\]); } return btoa(binaryString); } // 调用方法 const binaryData = ...; // 二进制流数据 const base64Data = convertBinaryToBase64(binaryData); console.log(base64Data); ``` 方法三:使用TextDecoder对象 可以使用TextDecoder对象将二进制流转化为字符串,然后再使用btoa函数将字符串转化为Base64编码的字符串。示例代码如下: ```javascript function convertBinaryToBase64(binary) { const decoder = new TextDecoder('utf-8'); const text = decoder.decode(binary); return btoa(text); } // 调用方法 const binaryData = ...; // 二进制流数据 const base64Data = convertBinaryToBase64(binaryData); console.log(base64Data); ``` 以上是三种常见的将二进制流转化为Base64的方法,你可以根据自己的需求选择其中一种方法来实现。 #### 引用[.reference_title] - *1* [前端二进制流转base64 (亲测有效)](https://blog.csdn.net/m0_60067716/article/details/124606097)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [js 二进制流转换base64图片](https://blog.csdn.net/qq_36529240/article/details/128610016)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [前台接收后台传过来的二进制文件流(二进制转为base64)](https://blog.csdn.net/weixin_43878003/article/details/99285925)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值