使用IPFS作为Java项目的文件系统

使用IPFS作为Java项目的文件系统


1. 项目中引入java-ipfs-http-client

编辑pom.xml文件,加入以下内容

<!--JitPack Git包管理-->
<repositories>  
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

<!--ipfs客户端-->
<dependencies>
    <dependency>
        <groupId>com.github.ipfs</groupId>
        <artifactId>java-ipfs-http-client</artifactId>
        <version>1.3.3</version>
    </dependency>
</dependencies>

java-ipfs-http-client包括四个依赖项:

  • multibase: 编码标准

  • multiaddr: 文件或端口的地址

  • multihash: 哈系,可根据编码标准转换

  • cidmultihash的扩展,文件内容id


2. 实例化IPFS

使用new IPFS()方法创建IPFS实例:

//输入IP与端口,可选api版本、限时与ssl协议开关
IPFS ipfs = new IPFS(String host, int port, (可空)String version, (可空)int connectTimeoutMillis, (可空)int readTimeoutMillis, (可空)boolean ssl);

or

//输入整个地址
MultiAddress multiaddr = new MultiAddress("http://*.*.*.*:*");
IPFS ipfs = new IPFS(multiaddr);

3. 上传文件到IFPS

ipfs-http-client支持文件、字节与输入流上传,可选单个或多个文件:

NamedStreamable file = new NamedStreamable.FileWrapper(File source)
NamedStreamable file = new NamedStreamable.ByteArrayWrapper((可空)String name, byte[] data)
NamedStreamable file = new NamedStreamable.InputStreamWrapper((可空)String name, InputStream data);

List<MerkleNode> results = ipfs.add(file)
List<MerkleNode> results = ipfs.add(List<NamedStreamable> files);

返回值MerkelNode为IPFS网络执行文件上传后的结果,类似区块链的出块,其结构为:

class MerkleNode {
    public final Multihash hash;
    public final Optional<String> name;
    public final Optional<Integer> size;
    public final Optional<String> largeSize;
    public final Optional<Integer> type;
    public final List<MerkleNode> links;
    public final Optional<byte[]> data;
}

作为文件系统的标识,hash字段应在数据表中保存,用于在之后进行文件获取或查询:

String hash = results.iterator().next().hash.toBase58();

4. 从IPFS中读取文件

通过之前保存的hash,可获取整个文件或文件在IPFS网络中的信息:

Multihash multihash = Multihash.fromBase58(hash);

//打印文件内容
byte[] data = ipfs.cat(multihash);
InputStream data = ipfs.catStream(multihash);

//下载文件
byte[] data = ipfs.get(multihash);

//查看文件信息
List<MerkleNode> nodes = ipfs.ls(multihash);

如果用户终端不支持ipfs网关,也可以考虑直接调用后端程序获取文件内容。

另外ipfs-http-client支持整个目录的上传与查询,其功能有待发掘。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值