在IPFS上托管图片

20221001补充:web3.storage已经把Free Plan上限降到5GB了,不再推荐使用.
可以试着通过TransferKit继续,不过它只有网页版.

之前一直在用 Picgo+GitHub 的方式托管图片,但是感觉不太好(其实就是想折腾),于是找了一下其他自建图床的办法.

原理

IPFS的原理与BT类似,本质上都是P2P连接.

但是IPFS可以通过各类公开网关直接访问其中的文件,格式为:

[IPFS Gateway]/ipfs/[CID v0]

[CID v1].ipfs.[IPFS Gateway]

而每一个文件夹/文件都对应有一个CID,这意味着,每次更改其中内容后其CID都会发生变化.

于是我们可以用IPNS解决这个问题.

可以理解为IPFS中的DNS,专门用于返回最新的CID.

IPFS部分

虽然理论上可以直接在本地运行IPFS节点,从而上传文件到IPFS网络中.

但是在实际使用时会有两个问题:

  1. 国内网络不友好.
  2. 若本地取消分享且其他节点没有备份,可能会在下一次自动删除中被清理掉,从而无法访问.

对于这两个问题,我们可以使用第三方托管平台解决.

这里我们使用 web3.storage(以下简称w3s) 提供的服务.

提供类似上传服务的网站还有很多,可以自行搜索.

w3s Token

首先登录进w3s网站.

Login-w3s

这里选择邮箱登录即可,当然,也可以使用临时邮箱来获取多个Token

每个Token带有1TB容量,一般人一个就足够了吧qwq

然后前往 Token 界面,输入Token名称以生成.

Token-w3s

这里将Token复制好,下一步需要用到.

w3s Cli

通过网站上传文件无疑是很麻烦的,所以我们选择使用Cli工具,在Terminal中操作

需要提前安装好 Node.js.

执行 npm install -g @web3-storage/w3 安装w3s Cli.

随后在Terminal中执行 w3 token ,输出结果应该类似于:

PS C:\Users\username> w3 token
√ Paste your API token for api.web3.storage · [YourToken]


⁂ API token saved

此时你已登入w3s Cli, 输入 w3 -h 即可得到使用说明.

以下是部分命令:

w3 put /path/to/your/file -n [自定义文件名]
#上传文件

w3 list
#查看已上传文件及其CID

w3 name create
#创建IPNS

w3 name publish [IPNS ID] /ipfs/[CID]
#将某个文件/文件夹添加到某个IPNS中

实际使用

假设你新建了一个名为Img的文件夹,并且添加了名为TEST1.jpg的文件,只需要执行:

w3 put ./Img
#将输出的CID记为α

w3 name create
#将输出的IPNS ID记为β

w3 name publish β /ipfs/α
#将Img文件夹对应到该IPNS ID

此时,你便可以通过 β.ipns.[IPFS Gateway]/Img/TEST1.jpg 访问到该图片.

若你想增添TEST2.jpg、TEST3.jpg……

只需要重复第一步与第三步即可.

绑定域名 [可选]

虽然这个时候已经能用了,但是IPNS ID那么长,看起来就不舒服 (bushi)

所以我们可以借助 DNSlink 功能,从我们自己的域名访问IPFS服务.

首先我们要选定一个网关(可以在附录寻找),并且设置好CNAME接入.

  • 假设你在使用 a.example.com

DNSlink1

然后新建一个TXT Record,名为[_dnslink.a],值为[dnslink=/ipns/β]

不知道β是什么?去看上文w (话说应该不会有人忘得这么快吧)

DNSlink2

到这里就已经完成咯

你现在可以通过 a.example.com/Img/[FileName] 来访问图片.

附录

IPFS官方网关

在大陆无法访问

Cloudflare网关

w3s网关

上传完文件后,可以试着先通过w3s网关访问一次,让更多的服务器缓存到你的文件.

Dweb网关