利用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;
}
利用FileReader进行二进制文件传输的更多相关文章
- 利用PHP取二进制文件头判断文件类型
<?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 779 ...
- html5中利用FileReader来读取文件。
利用FileReader来读取文件的能够来实现即时预览的效果,这个也是在html5中才有的功能. <!DOCTYPE html> <html lang="en"& ...
- WebService之Axis2(4):二进制文件传输
在<WebService大讲堂之Axis2(2):复合类型数据的传递>中讲过,如果要传递二进制文件(如图像.音频文件等),可以使用byte[]作为数据类型进行传递,然后客户端使用RPC方式 ...
- Netty之二进制文件传输
传输会话简要 客户端发起一个文本请求给服务器端, 服务器端解析里面文本, 返回文件给客户端, 客户端解析文件 服务器端 因为示例文件比较小, 所以没有做分段传输, 而是直接一次性把整个文件byte[] ...
- javascript 利用FileReader和滤镜上传图片预览
FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File或 Blob对象指定要读取的文件或数据. 1.FileReader接口的方法 Fi ...
- 利用FileReader实现上传图片前本地预览
引子 平时做图片上传预览时如果没有特殊的要求就直接先把图片传到后台去,成功之后拿到URL再渲染到页面上,这样做在图片比较小的时候没什么问题,大一点的话就会比较慢才能看到预览了,而且还产生了垃圾文件,所 ...
- 洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天
由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的 项目一:用socket实现文件传输 本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket ...
- Linux下利用ssh远程文件传输 传输命令 scp
在linux下一般用scp这个命令来通过ssh传输文件. 一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进 ...
- 媒体文件audio 转 base64 编码 (利用 FileReader & Audio 对象)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- python学习之利用socketserver的文件传输
使用socketserver进行多用户的文件传输 服务端 class FtpServer(socketserver.BaseRequestHandler): # 继承socketserver.Base ...
随机推荐
- 重新整理.net core 计1400篇[九] (.net core 中的依赖注入的服务注入)
前言 在该系列六中介绍了一个简单的依赖注入,该节介绍.net core 中的依赖注入的服务注入. ServiceDescriptor ServiceDescriptor 是服务描述的意思,这个是做什么 ...
- Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin[id:xxx.xxx.xxx]
前言 看下这个完整的bug: Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to appl ...
- python实现不同颜色气球隔开摆放,并且提示不能摆放的情况
这个是一位隐秘人物让我做的一道题(如标题),我也分享出来了. 首先是成品展示(暂时没有做成可视化界面的样子): 我做的是把所有的气球录入进来,然后利用基础数据结构(字典,数据等)排序等,由于我是初学, ...
- 力扣383(java&python)-赎金信(简单)
题目: 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成. 如果可以,返回 true :否则返回 false . m ...
- 技术解读:现代化工具链在大规模 C++ 项目中的运用 | 龙蜥技术
简介: 本文详细介绍我们在实际工作中的大型 C++ 项目中现代化工具链的实践以及结果. 编者按:C++ 语言与编译器一直都在持续演进,出现了许多令人振奋的新特性,同时还有许多新特性在孵化阶.除此之外, ...
- 手把手教你PolarDB-X中的表设计——用户表
简介: 本系列旨在描述一个具体的业务场景,给出建表的例子,帮助大家更好的使用PolarDB-X.本期的主题是:用户表. 本系列旨在描述一个具体的业务场景,给出建表的例子,帮助大家更好的使用PolarD ...
- 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
简介: 本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实现过程,以及通过 RocketMQ-Exporter 来 ...
- Quick BI产品核心功能大图(六)开放集成
简介:企业想要拥有领先的数据分析能力,自研往往需要投入巨大的人力和财力. Quick BI作为唯一一个连续两年入选Gartner魔力象限的中国BI产品,具备强大的全链路开放集成能力,可以轻松的与企业 ...
- Apache Flink在 bilibili 的多元化探索与实践
简介: bilibili 万亿级传输分发架构的落地,以及 AI 领域如何基于 Flink 打造一套完善的预处理实时 Pipeline. 本文由 bilibili 大数据实时平台负责人郑志升分享,本次分 ...
- iOS 端容器之 WKWebView 那些事
简介: 本文主要是关于在端容器设计开发过程中,WKWebView 使用上遇到的一些问题和解决办法 作者 | 驽良 来源 | 阿里技术公众号 一 背景 熟悉 iOS\macOS Hybrid 混合 ...