前言
提示:本文使用Node.js结合IPFS实现文件的上传和下载,IPFS可以简单的理解为一个分布式存储系统,在这上面上传或下载文件的速度十分快,亲测下载速度达35M/s,可以说是非常快的了。如果对IPFS的安装不熟悉的可以去看我的另一篇文章《IPFS的安装》。
一、项目准备首先安装好Node.js和IPFS,安装Node.js可以参考另一篇文章Node.js的安装与使用。安装好之后,我们还需要在node项目中安装ipfs所需要的模块依赖,学过node的应该都知道npm,直接使用npm进行安装即可,所需安装的模块依赖如下:
项目的目录如下所示:
其中package.json文件中就是我们所需要的依赖。
使用npm安装
npm install
执行上述代码后等待所有的模块安装完成即可。
2.封装ipfs接口封装ipfs的上传和下载功能,代码如下:
const ipfsAPI = require('ipfs-api');
const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});
const fs = require('fs');
//传入要上传的文件路径
exports.add = (addPath) =>{
return new Promise((resolve,reject)=>{
try {
let buffer = fs.readFileSync(addPath);
ipfs.add(buffer, function (err, files) {
if (err || typeof files == "undefined") {
reject(err);
} else {
resolve(files[0].hash);
}
})
}catch(ex) {
reject(ex);
}
})
}
//传入文件的hash地址以及要下载到哪个目录的路径
exports.get = (hash,getPath) =>{
return new Promise((resolve,reject)=>{
try{
ipfs.get(hash,function (err,files) {
if (err || typeof files == "undefined") {
reject(err);
}else{
fs.writeFileSync(getPath,files[0].content);
resolve('ok');
}
})
}catch (ex){
reject(ex);
}
});
}
3.开启ipfs
在系统命令行中输入开启ipfs的命令:
ipfs daemon
开启成功如下图:
const ipfsAPI = require('ipfs-api');
const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});
const fs = require('fs');
let User = {
"name":"yyn",
"age":23,
"level":"test"
};
buff = Buffer.from(JSON.stringify(User));
var hashStr = '';
//上传模型参数
ipfs.add(buff,async (err,result)=>{
if(err) throw err;
console.log(result); //打印上传的信息
hashStr = result[0].hash; //保存hash值
console.log(hashStr); //输出上传后所获得的hash值
});
//下载模型参数
var resuleStr;
let hashStr = 'QmeDaPoWWQmswu8yrGoY6DrnU158iACSLJwy5RegTUXRdv';
ipfs.cat(hashStr,async (err,buffer)=>{
if(err) throw err;
resuleStr = buffer.toString();
console.log('打印下载的模型参数: '+resuleStr);
let User = JSON.parse(resuleStr); //转化json 获取单个参数
console.log(User);
console.log('获取模型参数中的某个数据(name): '+User.name);
})
//尝试上传文件路径
var addPath = "./file/add/test3.mp4";
var buff = fs.readFileSync(addPath);
//console.log(buff);
ipfs.add(buff,async (err,result)=>{
if(err) throw err;
console.log(result);
var hash = result[0].hash;
console.log(hash);
})
//下载文件
var hashStr = 'QmZY39pRrAqwEZPr9wcoomuBbSaZmi3wsbhTDwd9aXSazL';
var getPath = "./file/get/test3.mp4";
ipfs.get(hashStr,async (err,result)=>{
if(err) throw err;
console.log(result); //注意:调用get方法时回调函数中的参数是一个数组形式 内容在content中
fs.writeFileSync(getPath,result[0].content);
console.log('file: ' + getPath);
console.log('从ipfs中下载文件成功!')
//写入文件
})
var hashStr = 'QmZY39pRrAqwEZPr9wcoomuBbSaZmi3wsbhTDwd9aXSazL';
ipfs.get(hashStr,archive=true,'./file/get/test3qq.mp4',async(err,result)=>{
if(err) throw err;
console.log(result); //注意:调用get方法时回调函数中的参数是一个数组形式 内容在content中
//fs.writeFileSync(getPath,result[0].content);
//console.log('file: ' + getPath);
console.log('从ipfs中下载文件成功!')
//写入文件)
})
ipfs.add(buff,async (err,result)=>{
if(err) throw err;
console.log(result); //打印上传的信息
hashStr = result[0].hash; //保存hash值
console.log(hashStr); //输出上传后所获得的hash值
});
部分执行结果如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)