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

时间:2024-11-09 08:07:53

文章目录

  • 前言
  • 一、项目准备
  • 二、项目实现
    • 1.安装IPFS所需依赖
    • 2.封装ipfs接口
    • 3.开启ipfs
    • 4.使用node调用ipfs


前言

提示:本文使用结合IPFS实现文件的上传和下载,IPFS可以简单的理解为一个分布式存储系统,在这上面上传或下载文件的速度十分快,亲测下载速度达35M/s,可以说是非常快的了。如果对IPFS的安装不熟悉的可以去看我的另一篇文章《IPFS的安装》

一、项目准备

首先安装好和IPFS,安装可以参考另一篇文章的安装与使用。安装好之后,我们还需要在node项目中安装ipfs所需要的模块依赖,学过node的应该都知道npm,直接使用npm进行安装即可,所需安装的模块依赖如下:
在这里插入图片描述

二、项目实现

1.安装IPFS所需依赖

项目的目录如下所示:
在这里插入图片描述
其中文件中就是我们所需要的依赖。
使用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);
//(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中
        //(getPath,result[0].content);
        //('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值
});

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