Node.js使用IPFS实现文件上传和下载


前言

提示:本文使用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);
        }
    })
}
//传入文件的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

开启成功如下图:
在这里插入图片描述

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;  //保存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值
});

部分执行结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiaoning9299/article/details/121341804