利用FileReader进行二进制文件传输
一、读取本地二进制文件,上传(数据库文件为例)
二进制文件读取的时候应当直接读取成字节数组,以免在调试时造成误解。比如数据库文件里面的有些字段是utf8编码,因此,采用utf-8编码读出来也能看到一些数据,但任然不应该用指定编码的格式读取。
web端
先读取到ArrayBuffer,在获取ArrayBuffer的Uint8Array字节数组形式,最后用base64编码字节数组用于传输。
var reader = new FileReader();//这是核心,读取操作就是由它完成. reader.readAsArrayBuffer(selectedFile);//读取文件的内容 reader.onload = function () { //当读取完成后回调这个函数,然后此时文件的内容存储到了result中,直接操作即可 var file = this.result;//arraybuffer对象(有3种表示方法) var view = new Uint8Array(file);//提取二进制字节数组,使用Uint8Array表示 console.log("读取"); console.log(binary2base64(view));//base64编码,binary2base64自定义与下文,功能为返回二进制数组的base64编码字符串 }
//二进制字节数组转base64编码的字符串 function binary2base64(bi) { let str = ''; for (let i = 0, len = bi.length; i < len; i++) { str += String.fromCharCode(bi[i]); } return btoa(str); }
服务器端
将字符串解码成字节数组再写入文件
//假设已经从Request请求中获得了上传的文件dbfile public void CreateDB(string dbfile) { //创建空文件用于写入数据库 string path = $@"dbfile.db"; File.Create(path).Dispose(); //解码base64数据为二进制字节数组 byte[] file=Convert.FromBase64String(dbfile)); //写入数据库 File.WriteAllBytes(path, file); }
二、二进制文件下载
服务器端
直接读取文件到字节数组,在编码为base64字符串,传输到web端
public string outPortDB() { string path="dbfile.db"; //对于二进制文件,直接读取二进制数据 byte[] file = File.ReadAllBytes(path); //base64编码 string fileStr = Convert.ToBase64String(file); return fileStr; }
web端
将字符串解码成字节数组,再模拟点击下载
$.ajax({ url: "...", type: "post", data: { ... }, success: function (data) { //base64解码成二进制字节数组 //base64ToArrayBuffer将字符串解码转换成字节数组,定义在下文 var file = new Blob([base64ToArrayBuffer(data)]); // 通过a标签把内容下载到本地 var obj = window.URL.createObjectURL(file); var btn = document.createElement("a"); btn.download = "dbfile.db"; btn.href = obj; btn.click(); }, error: function (data) { alert("下载失败"); } });
//base64转二进制字节数组 function base64ToArrayBuffer(base64) { //先解码成字符串(utf8编码表示) var binary_string = window.atob(base64); var len = binary_string.length; var bytes = new Uint8Array(len); for (var i = 0; i < len; i++) {
//获取每个字符的实际二进制字节 bytes[i] = binary_string.charCodeAt(i); }
//实际上返回的是ArrayBuffer对象 return bytes.buffer; }