多宽带叠加的分布式云盘:文件秒传、断点续传、大文件下载

  • 1. 前言
  • 2. 各种私有云盘对比
  • 3.本云盘实现的功能
  • 4. 界面
  • 4. 安装
    • 4.1 负载均衡服务器
    • 4.1 储存节点
  • 5. 代码说明

1. 前言

家中有三条宽带,想通过搭建私有云盘,叠加上传和下载的速度。对比了多种私有云的系统,没找到满足的要求的,所以便萌生出搭建一个可宽带叠加的分布式私有云存储。

2. 各种私有云盘对比

可道云、Nextcloud、易有云:没有多节点。
Cloidreve:有从服务器,但只是用来离线下载的
Seafile:支持ceph分布式储存,只能单节点。
IPFS:去中心化,p2p,未来之星。网关被污染了,有点费硬盘。
Minio: 分布式储存,但传输时只有一个节点传输,别的节点负责加油。
Resilio Sync、微力备份(接近要求,但属于备份软件,比较占储存空间)
jigdo(实现不了,没找到部署教程)(大佬可是试试这个)

3.本云盘实现的功能

√ 多节点
√ 部署简单
√ 文件秒传
√ 断点续传
√ MD5值校验
√ minio存储(防止文件上传漏洞)
√ 大文件下载(数据流的方式,内存占用小)
√ 下载和上传的速度基本取决于宽带上传的下载的速度。

4. 界面

上传界面

文件浏览

4. 安装

4.1 负载均衡服务器

负责提供浏览界面,接收客户端的请求,返回文件的md5。


只需修改config.php

<?php
//添加节点地址
$nodes = ['http://ip1:80',"http://ip2:80"];
$dbh = new PDO('mysql:host=localhost;dbname=dbname', "dbuser", "password");
?>

4.1 储存节点

修改

########################需要修改########################
minioClient = Minio('ip:9000',access_key='minio_key',secret_key='minio_secret',secure=False) #如果是采用https则,secure=True。
buckets = "mydisk"
########################需要修改########################

运行

//运行minio
/home/minio/app/minio server /home/minio/data --config-dir /home/minio/config --console-address :42606 --address :9000//运行node.py
python3 node.py

5. 代码说明

计算文件的MD5 ,获取切片

/*** 计算文件的MD5 ,获取切片* @param file 文件* @param chunkSize 分片大小* @returns Promise*/
function md5(file, chunkSize = 1024*1024*1) {return new Promise((resolve, reject) => {let blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;let chunks = Math.ceil(file.size / chunkSize);let currentChunk = 0;let spark = new SparkMD5.ArrayBuffer();let fileReader = new FileReader();var slices = [];fileReader.onload = function(e) {spark.append(e.target.result); currentChunk++;num = 100*currentChunk/chunks;num = num.toFixed(2);jindutiao(num,"计算哈希","#7A0BE2")if (currentChunk < chunks) {loadNext();} else {slices.push(spark.end());resolve(slices);}};//       fileReader.onerror = function(e) {//          reject(e);
//      };function loadNext() {let start = currentChunk * chunkSize;let end = start + chunkSize;if (end > file.size){end = file.size;}slice = blobSlice.call(file, start, end);slices.push(slice);fileReader.readAsArrayBuffer(slice);}loadNext();});
}

上传片段

//上传片段
function sendChunk(id, chunks,offset,name){// 逐个提交// 用于保证ajax发送完毕var  task=offset.length;var  alllen = chunks.length ;chunks.forEach(function(chunk, index){if (offset.length > 0) {text = "断点续传";}if (offset.length === 0){text = "文件上传";}if (offset.indexOf(index.toString()) >= 0) {return;}var formData = new FormData();formData.append('fileId', id);formData.append('myFileChunk', chunk);formData.append('chunkIndex', index);url = nodes[index%nodes.length]+"/success";console.log(url);$.ajax({type: "POST",url: url,data: formData,contentType: false,processData: false,async: true,success: function(done){console.log("a00" + done + "a00");if(done == 200){task =task + 1;num = 100*task/alllen ;num = num.toFixed(2);console.log(index + "已完成" + num.toString() + "%");jindutiao(num,text)  }}})})
}

进度条

//进度条
function jindutiao(ini,text,color="pink") {let texth = document.getElementById("text");let cont = document.getElementById("cont");let container = document.getElementById("container");cont.style.backgroundColor = color;container.style.display = 'block';cont.style.width = ini + "%";if(ini>=100){text = text + "成功";ini = 100.00;}texth.innerText = text + ": " + ini + "%";
}

下载文件,二进制的方式。

//下载文件,二进制的方式。
function getBinaryContent(url , i) {//console.log("getBinaryContent : " + url);return new Promise((resolve, reject) => {try {let xhr = new XMLHttpRequest();xhr.open("GET", url, true);xhr.responseType = "arraybuffer"; // 设置返回的类型为arraybufferxhr.onload = function () {resolve({index: i, // 文件块的索引buffer: xhr.response, // 范围请求对应的数据});};xhr.onprogress=function(event){if(event.lengthComputable) {var percentComplete = event.loaded / event.total*100;percentComplete = percentComplete.toFixed(2);//console.log("当前下载进度: " + event.loaded + "," + event.total , percentComplete);//updateProgress(percentComplete * 100);}}xhr.send();} catch (err) {reject(new Error(err));}});}

多进程

//多进程
//poolLimit 代表进程池的数量
async function download( urls, poolLimit = 2 ) {// // Abort the download stream when leaving the page// window.isSecureContext && window.addEventListener('beforeunload', evt => {//   writer.abort()// })const fileStream= streamSaver.createWriteStream(filename);const writer = fileStream.getWriter();const all_part_num = Object.keys(urls).length;const pools = oneArrToTwoArr([...new Array(all_part_num).keys()],poolLimit*2);const MD5 = new SparkMD5();//分组下载for (let pool of pools) {var results = await asyncPool(poolLimit,pool,(i) => {//console.log(urls[i])ini = (i+1)/all_part_num*100;ini = ini.toFixed(2)jindutiao(ini,"文件下载")//异步下载,返回到resultsreturn getBinaryContent(urls[i], i);});    //文件数据 格式转换,转换为数组的类型var sortedBuffers = results.map((item) => new Uint8Array(item.buffer));for (let array of sortedBuffers) {writer.write(array)}  }writer.close();
}
async function asyncPool(poolLimit, array, iteratorFn) {const ret = []; // 存储所有的异步任务const executing = []; // 存储正在执行的异步任务for (const item of array) {// 调用iteratorFn函数创建异步任务const p = Promise.resolve().then(() => iteratorFn(item, array));ret.push(p); // 保存新的异步任务// 当poolLimit值小于或等于总任务个数时,进行并发控制if (poolLimit <= array.length) {// 当任务完成后,从正在执行的任务数组中移除已完成的任务const e = p.then(() => executing.splice(executing.indexOf(e), 1));executing.push(e); // 保存正在执行的异步任务if (executing.length >= poolLimit) {await Promise.race(executing); // 等待较快的任务执行完成}}}return Promise.all(ret);
}

下载文件,二进制的方式。

//下载文件,二进制的方式。
function getBinaryContent(url , i) {//console.log("getBinaryContent : " + url);return new Promise((resolve, reject) => {try {let xhr = new XMLHttpRequest();xhr.open("GET", url, true);xhr.responseType = "arraybuffer"; // 设置返回的类型为arraybufferxhr.onload = function () {resolve({index: i, // 文件块的索引buffer: xhr.response, // 范围请求对应的数据});};xhr.onprogress=function(event){if(event.lengthComputable) {var percentComplete = event.loaded / event.total*100;percentComplete = percentComplete.toFixed(2);//console.log("当前下载进度: " + event.loaded + "," + event.total , percentComplete);//updateProgress(percentComplete * 100);}}xhr.send();} catch (err) {reject(new Error(err));}});}

多宽带叠加的分布式云盘:文件秒传、断点续传、大文件下载相关推荐

  1. 基于Hadoop2.2.0版本号分布式云盘的设计与实现

    基于Hadoop2.2.0版本号分布式云盘的设计与实现 一.前言 在学习了hadoop2.2一个月以来,我重点是在学习hadoop2.2的HDFS.即是hadoop的分布式系统,看了非常久的源代码看的 ...

  2. 基于Hadoop2.2.0版本分布式云盘的设计与实现

    基于Hadoop2.2.0版本分布式云盘的设计与实现 一.前言 在学习了hadoop2.2一个月以来,我重点是在学习hadoop2.2的HDFS.即是hadoop的分布式系统,看了很久的源代码看的我真 ...

  3. 存储在icloud云盘文件夹顶层_重大问题!icloud云盘自动重命名且丢失文件… - Apple 社区...

    情景:家中是mac,公司是windows,为了在家使用mac工作方便而将公司文件储存在icloud云盘中共享. 配置:公司windows 10电脑上安装最新icloud云盘客户端,并将文件保存在icl ...

  4. 存储在icloud云盘文件夹顶层_iCloud云盘文件夹共享功能使用方法

    类型:桌面工具大小:37.2M语言:中文 评分:10.0 标签: 立即下载 在我们的苹果手机当中很多人不知道其实我们手机自带有云盘的,就是iCloud云盘文件夹,其中也有个共享的功能,可以和别人互相分 ...

  5. 天翼网盘目录php,天翼云盘文件同步与目录设置方法

    电脑知识-电脑高手网(http://www.dngsw.cn):天翼云盘文件同步与目录设置方法 在天翼云客户端中,不仅能够为我们提供文件上传功能,而且它还具有文件自动同步的功能,用户在下载使用天翼云P ...

  6. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...

  7. 华为云OBS文件上传下载工具类

    Java-华为云OBS文件上传下载工具类 文章目录 Java-华为云OBS文件上传下载工具类 1.华为云obs文件上传下载 2.文件流转MultipartFile 3.File转换为Multipart ...

  8. 华为云OBS文件上传和下载

    华为云Obs文件上传和下载 使用的技术 前端是Vue框架,element-ui 后端是Springboot项目 服务器是华为云 文件上传下载地方是华为云Obs对象存储服务 1.前端上传代码 el-up ...

  9. tp5封装腾讯云cos文件上传sdk

    第一步: 使用命令安装sdk到框架vendor目录里 composer require tencentcloud/tencentcloud-sdk-php 第二步:在application/commo ...

最新文章

  1. Python字典部分源码分析,字典是无序的
  2. python shell背景颜色改变_科学网—Python Shell Background Color - 李旭的博文
  3. Error in bl_make_text_box(token, drawing_context$gp, drawing_context$yoff_pt) : function ‘Rcpp_preci
  4. Schnorr签名与比特币隐私的必然性
  5. 无暇素数c语言百度,华为招聘--前人经验(转贴)
  6. SQL基础--完整性约束
  7. 安装完Visual Team System 2008 Team Explorer出错解决办法
  8. 在Spring Boot里面,怎么获取定义在application.properties文件里的值
  9. 数据持化技术的发展演变(SQL、JDBC、mybatis)
  10. 计算机不属于发明保护客体,如何判断两种类型的计算机程序发明能否成为专利保护客体?...
  11. Python笔记4 实例之批量修改文件名
  12. SQL Pass北京举办第六次线下活动,欢迎报名
  13. 6.Composer实现PHP中类的自动加载
  14. Spring Boot 中实现定时任务的常用方式--Quartz
  15. mobile的一些link
  16. oracle rman 备份与还原
  17. 宝藏又小众的海边场景 海底 海岛unity3d模型素材网站分享
  18. laravel入门教程(一)
  19. 强劲的网络。http://www.chartboost.com/
  20. 漏洞复现:DNS 缓存投毒的经典—— 2008年 kaminsky 漏洞

热门文章

  1. 极速office(Word)文件怎么在方框里面打对勾
  2. ARM:你从未听说过的英国最成功的科技公司
  3. 80句经典英文电影台词,英语作文最佳素材
  4. LoadRunner的函数全集
  5. 自己的第一份保险(均来自太平):“福禄康瑞2018重疾险” + “医无忧” + “爱无忧”(状态:已退,20190530)...
  6. python模拟seo_百度统计原理分析-利用Python实现模拟访问
  7. 目标追踪拍摄?目标遮挡拍摄?拥有19亿安装量的花瓣app,究竟有什么别出心裁的功能如此吸引用户?
  8. 那些爆火的游戏背后,是如何让你一步一步上瘾的?
  9. python实现mysql多条件查询筛选功能
  10. [转载] 晓说——第25期:看美国系列之“两极分化的黑人”