谈一谈开发网盘中碰到的问题(一)

本文介绍了土星云企业网盘的开发细节,特别是基于ipfs的分布式存储上传机制。文件上传过程包括内存检查、密钥生成、文件处理、分发存储及进度同步。对于浏览器解析的文件夹结构不适应问题,作者封装了自定义的文件信息结构。此外,还展示了单个文件、多文件和复杂文件夹上传前后的结构对比。
摘要由CSDN通过智能技术生成

谈一谈开发网盘中碰到的问题(一)

首先介绍一下项目:土星云企业网盘(http://www.saturncloud.com.cn/netdisk),一款基于vue+element ui面向企业和用户的人员管理和存储网盘。主要功能包含:文件、文件夹并行上传下载,复合文件(超过4G)的上传、下载。文件、文件夹分享功能,文件夹共享功能。文件、文件夹重命名、复制、移动功能。文件、文件夹批量删除、下载、移动功能。已删除文件、文件夹批量还原、彻底删除功能。上传下载列表展示功能。内部共享功能,公共资源功能。人员管理链接邀请成员功能。企业信息和产品套餐功能等。基本功能类似百度企业网盘。

本项目,上传采用的是ipfs分布式存储上传。感兴趣的童鞋可以了解一下。因为和传统的http上传下载不同,所以在前端处理上会用到许多知识点。首先,所有的上传下载都依赖以’Saturn Agent '命名的桌面客户端。不同的系统对应不同的客户端。在这里插入图片描述

本项目文件上传可以概括为:

1.file_upload 检查内存是否充足
2.random 生成密钥(45位字符串,文件加密/解密密钥,multibase-Base58BTC编码)
3.pack(POST multipart/form-data) 将文件size,random返回值等作为参数,对原始文件进行处理,完成压缩、加密、切片。返回Multihash等值
4./ws/up 文件上传接口,将数据块、链接块 分发给不同的存储节点冗余编码计算(并行),生成 校验块 分发给不同的存储节点使用websocket协议反馈数据上传进度、速度信息。将pack返回的Multihash作为文件标识,socket更新的percent同步上传列表文件进度。为防止因网速等因素导致token失效,在同步进度同时要在socket推送过程中触发/combo/123请求来延长token
5.Add_file 服务器上传(普通文件is_dir传-1,文件夹传1,复合文件传2),ipfs上传完毕后将文件上传到服务器上。

由此,是一个普通文件的上传过程。如果选择多个文件的话,则循环重复上述操作。如果选择文件夹的话,则通过我自己封装的一个方法(后面会介绍)来判断如果是文件夹的话则is_dir传1,如果是文件的话依然重复上述操作。这里主要需要注意一个问题,选择上传的文件夹里面的文件、文件夹路径要跟最终页面上展示的一模一样。

Q1:浏览器解析文件夹files属性后返回的文件信息不满足或不好处理文件上传业务
处理方法:封装我需要的文件信息结构
let TREE = function (name, is_dir) {
                                this.name = name;
                                this.is_dir = is_dir;
                                this.path = "";
                                this.index;
                                this.size;
                                this.children = [];
                                this.add = function (child) {
                                    this.children.push(child);
                                };
                            };
                            var now_dir;
                            var children;
                            let root = new TREE(
                                folder[0].webkitRelativePath.split("/")[0],
                                1
                            );
                            for (var i = 0; i < folder.length; i++) {
                                var folderPath = folder[i].webkitRelativePath.split("/");
                                now_dir = root;
                                for (var j = 1; j < folderPath.length - 1; j++) {
                                    var find_flag = 0;
                                    for (var k = 0; k < now_dir.children.length; k++) {
                                        if (now_dir.children[k].is_dir == 1)
                                            children = now_dir.children[k];
                                        else continue;

                                        if (children.name == folderPath[j]) {
                                            find_flag = 1;
                                            now_dir = children;
                                            break;
                                        }
                                    }

                                    if (find_flag == 0) {
                                        let new_dir = new TREE(folderPath[j], 1);
                                        now_dir.add(new_dir);
                                        now_dir = new_dir;
                                    }
                                }

                                let file = new TREE(folderPath[j], 0);
                                file.path = folder[i].webkitRelativePath;
                                file.index = folder[i];
                                file.size = folder[i].size
                                now_dir.add(file);
                            }
                            console.log(root)
分别打印选择文件、多文件、层级复杂文件夹封装前后的浏览器解析结构

单个文件在这里插入图片描述
多个文件在这里插入图片描述
文件夹封装前后对比在这里插入图片描述

又到了快下班的时间,干饭去~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值