使用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
: 哈系,可根据编码标准转换 -
cid
:multihash
的扩展,文件内容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
支持整个目录的上传与查询,其功能有待发掘。