zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Golang语言情怀--第101期 区块链技术-以太坊公链NFT图片去中心化存储-第2节:go语言实现IPFS存储demo

2023-02-18 16:28:35 时间

需要的库:

import (
    shell "github.com/ipfs/go-ipfs-api"
)

上传到IPFS代码demo:

func IPFSTest(filename string) (string, string) {
    hashMap := make(map[int]string, 10000)
    // 上传文件 -- 可以是前端上传,也可以是后端上传
    file := fmt.Sprintf("file/" + filename) // 本地图片
    raw := Read(file)
    d := ""
    if raw != nil {
        // 文件夹---
        hash, err := UploadIPFS(raw)
        if err != nil {
            log.Println("UploadIPFS err", err)
        } else {
            hashMap[0] = fmt.Sprintf("https://ipfs.io/ipfs/%s?filename=%s", hash, hash)
        }
        d = hash
        log.Println("hash", hash)
    }
    // 写到本地
    WriteHash("hash.json", hashMap)
    return hashMap[0], d
}

func UploadIPFS(raw []byte) (string, error) {
    sh := shell.NewShell(IPFS_Host)
    reader := bytes.NewReader(raw)
    fileHash, err := sh.Add(reader)
    if err != nil {
        return "", err
    }
    fmt.Println(fileHash)
    return fileHash, nil
}

// 写数据
func WriteHash(writeJson string, cont interface{}) {
    if distFile, err := os.OpenFile(writeJson, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); err != nil {
        log.Println("create file failed", err)
    } else {
        enc := json.NewEncoder(distFile)
        if err1 := enc.Encode(cont); err1 != nil {
            log.Println("write failed", err1)
        } else {
            log.Println("write successful")
        }
    }
}


func Read(filepath string) []byte {
    f, err := os.Open(filepath)
    if err != nil {
        log.Println("read file fail", err)
        return nil
    }
    defer f.Close()

    fd, err := ioutil.ReadAll(f)
    if err != nil {
        log.Println("read to fd fail", err)
        return nil
    }
    return fd
}

实际效果(本地节点开放了5001端口才可以查看):

实际上传文件、图片、视频查看地址:

https://ipfs.io/ipfs/QmNtCUPC6sBZo8rmCjFhQkU6LAnB8ejDi2LTziFFeir838
https://ipfs.io/ipfs/

实际连接:https://ipfs.io/ipfs/+hash数据;访问上传到节点数据,上传后建议过几分钟后再去获取,确保已经同步到访问的节点数据。

注意:訪問ipfs.io需要可續上網

本期就到这里,下期再见。

同学们,兴趣是最好的老师;只争朝夕,不负韶华!加油!


参考资料:

Go语言中文文档

http://www.golang.ltd/

Go语言在线编辑器:

http://OL.Golang.LTD/

LollipopGo社区(筹建中)

https://www.LollipopGo.Com/