前言
提示:本文使用Node.js结合IPFS实现文件的上传和下载,IPFS可以简单的理解为一个分布式存储系统,在这上面上传或下载文件的速度十分快,亲测下载速度达35M/s,可以说是非常快的了。如果对IPFS的安装不熟悉的可以去看我的另一篇文章《IPFS的安装》。
一、项目准备
首先安装好Node.js和IPFS,安装Node.js可以参考另一篇文章Node.js的安装与使用。安装好之后,我们还需要在node项目中安装ipfs所需要的模块依赖,学过node的应该都知道npm,直接使用npm进行安装即可,所需安装的模块依赖如下:
二、项目实现
1.安装IPFS所需依赖
项目的目录如下所示: 其中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);
}
})
}
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
开启成功如下图:
4.使用node调用ipfs
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;
console.log(hashStr);
});
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);
console.log(User);
console.log('获取模型参数中的某个数据(name): '+User.name);
})
var addPath = "./file/add/test3.mp4";
var buff = fs.readFileSync(addPath);
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);
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);
console.log('从ipfs中下载文件成功!')
})
ipfs.add(buff,async (err,result)=>{
if(err) throw err;
console.log(result);
hashStr = result[0].hash;
console.log(hashStr);
});
部分执行结果如下:
|