利用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; }

 

posted @ 2021-07-02 12:51  ggtc  阅读(961)  评论(0编辑  收藏  举报
//右下角目录