第4章:构建简单的文件共享应用(下)
📥 文件下载:从星际迷航到本地存储
async downloadFile(cidString) {
const cid = CID.parse(cidString)
const chunks = []
for await (const chunk of this.fs.cat(cid)) {
chunks.push(chunk)
}
const fileContent = new Blob(chunks)
const url = URL.createObjectURL(fileContent)
// 创建下载链接
const a = document.createElement('a')
a.href = url
a.download = fileName
a.click()
URL.revokeObjectURL(url)
}
流式传输的优势:使用for await循环处理文件块,就像用桶从井里打水,而不是试图一次性搬走整个井。
🔗 生成可分享链接
generateShareLink(cid, fileName) {
const ipfsUrl = `ipfs://${cid}`
const gatewayUrl = `https://ipfs.io/ipfs/${cid}`
return { ipfsUrl, gatewayUrl }
}
🧪 测试应用
async function runTests() {
const testFile = new Blob(['Hello, Helia!'])
testFile.name = 'test.txt'
const cid = await app.uploadFile(testFile)
console.log(`✅ 上传成功! CID: ${cid}`)
const downloaded = await app.downloadFile(cid)
console.log('✅ 下载成功!')
}
🌊 应对现实挑战:处理网络波动
async resilientDownload(cidString, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await this.downloadFile(cidString)
} catch (error) {
const delay = Math.pow(2, attempt) * 1000
await new Promise(r => setTimeout(r, delay))
}
}
}
等待时间公式:
$等待时间 = 2^{尝试次数} \times 基础延迟$
🎯 本章回顾
我们从一个空白的HTML文件开始,逐步添加了:
- Helia集成 - 在浏览器中运行完整的IPFS节点
- 文件上传 - 将文件内容转化为不可变的CID
- 文件下载 - 通过CID从网络中检索内容
- 分享功能 - 生成去中心化的IPFS链接
- 错误处理 - 优雅地处理网络波动
这就是去中心化Web的力量——它不在遥远的未来,它就在你的代码编辑器中!
下一章:高级功能