利用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 ...
随机推荐
- 开源LaTex可视化编辑器推荐,支持LaTex代码补全,一键套用模板!
https://latexlive.com/ 这还是个开源项目,不过是C#的,搭建的成本比较大,没PHP好搞. 下面是这个网站
- 深入理解 Java 多线程、Lambda 表达式及线程安全最佳实践
Java 线程 线程使程序能够通过同时执行多个任务而更有效地运行. 线程可用于在不中断主程序的情况下在后台执行复杂的任务. 创建线程 有两种创建线程的方式. 扩展Thread类 可以通过扩展Threa ...
- openGauss每日一练第6天
学习地址 https://www.modb.pro/course/133 学习目标 学习 openGauss 创建模式.修改模式属性和删除模式 模式是一组数据库对象的集合,主要用于控制对数据库对象的访 ...
- 如何监控容器或K8s中的OpenSearch
概述 当前 OpenSearch 使用的越来越多, 但是 OpenSearch 生态还不尽完善. 针对如下情况: 监控容器化或运行在 K8s 中的 OpenSearch 我查了下, 官方还没有提供完备 ...
- Docker安装使用--Centos
目录 前言 Docker安装使用 安装步骤 卸载旧版本 安装utils 配置utils的存储库 安装Docker 安装指定版本Docker 验证安装 官网安装说明 阿里云镜像加速 Docker使用 帮 ...
- flask通过线程池实现异步
from flask import Flask from time import sleep from concurrent.futures import ThreadPoolExecutor # D ...
- k8s集群部署1.28.2版本(无坑)
Kubernetes-1.28.2 集群介绍及搭建 一.Kubernetes 概述 1.什么是Kubernetes? K8S 的全称为 Kubernetes.用于自动部署.扩展和管理"容器化 ...
- 第七課-Channel Study For HTTP Listener & Web Service Sender Intercommunicates Response Handler
示例说明: 系统A发送XML格式患者信息到Mirth的Source端HTTP Listener,完成患者信息入库逻辑:然后Mirth的Destinations端Web Service Sender调用 ...
- AHPA:开启 Kubernetes 弹性预测之门
简介:阿里巴巴云原生团队和阿里达摩院决策智能时序团队合作开发 AHPA 弹性预测产品,该产品主要出发点是基于检测到的周期做"定时规划",通过规划实现提前扩容的目的,在保证业务稳定 ...
- 如何在零停机的情况下迁移 Kubernetes 集群
简介:本文将通过集群迁移的需求.场景以及实践方式,介绍如何基于阿里云容器服务 ACK,在零停机的情况下迁移 Kubernetes 集群. 作者:顾静(子白)|阿里云高级研发工程师:谢瑶瑶(初扬)|阿 ...