• 利用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; }
  • 相关阅读:
    修改sqlserver2008中表的schema
    MongoDB学习笔记06
    MongoDB学习笔记05
    MongoDB学习笔记04
    在IIS Express中调试时无法读取配置文件
    Spring 集成Redis
    Java操作Redis(代码演示)
    Redis的一些常用命令操作
    Redis安装步骤
    如何彻底删除电脑安装的软件程序?
  • 原文地址:https://www.cnblogs.com/ggtc/p/14960410.html
Copyright © 2020-2023  润新知