引入
2023年,我在zhelper search上查书,了解到了ipfs技术。当时并没有觉得有什么,便不再理它。
时隔一年后(2024年),我在下galgame的时候知道了梓零的网站。当时下得非常开心,但是没一两月E5炸了,梓零倒了。于是我在想有什么办法能成本低地分享大文件,并且还不容易挂。这时我突然想起了ipfs协议,并浅浅地学习了一下。
开端
ipfs协议是一个非常新的东西(2012年面世),但是它却非常地NB(原谅我词穷了)。我认为ipfs协议NB之处有四点:
-
资源比较稳定(只要不过于冷门,一般不会丟失)
-
理论上永远不会被墙
-
免费上传,免费下载
看到这里,可能资源大佬觉得与种子差不多,但是ipfs协议与种子有一个最大的区别,就是:
无需做种,资源是否冷门只决定资源存在时长,不决定下载速度
发展
那么怎么用ipfs协议呢?论坛已有大佬给出教程。我这里再补一个网关和测速的:
虽说ipfs协议比较稳定,但是速度也只稳定在80-100kB/s,这也是很多大佬放弃ipfs协议的原因。难道ipfs协议真的只是空有的...NB吗?
高潮
ipfs协议之所以低速,是因为ipfs不支持多线程下载。如果大佬们浅浅了解ipfs/web3的话,便会知道ipfs从技术上就不支持多线程下载。
那么ipfs真的没救了吗?
托马斯·维德曾言“前进,前进!不择手段地前进!”如果ipfs不支持多线程的话,那么我们便强行让它支持就可以了。
我们使用BinaryCutting-Tool切分文件为n个1MB左右的文件,之后写一个index.html
,可以多线程地下载这n个文件,之后再合并成原文件下载。这样就解决了多线程的问题。
下面附上demo的index.html(用文心一言生的,不过我觉得不行。这也是我发这个话题的原因——请大佬修改出一个更好的代码)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Parallel Download</title>
</head>
<body>
<h1>Parallel Download Example</h1>
<button id="downloadButton">Start Download</button>
<div id="status"></div>
<script>
const TOTAL_PARTS = n; // Replace n with the actual number of parts
const BASE_URL = 'https://example.com/';
const OUTPUT_FILE_NAME = 'file.name';
document.getElementById('downloadButton').addEventListener('click', async () => {
const statusDiv = document.getElementById('status');
statusDiv.textContent = 'Downloading...';
const partPromises = [];
for (let i = 1; i <= TOTAL_PARTS; i++) {
partPromises.push(downloadPart(i));
}
try {
const parts = await Promise.all(partPromises);
const blob = new Blob(parts);
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = OUTPUT_FILE_NAME;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
statusDiv.textContent = 'Download complete!';
} catch (error) {
statusDiv.textContent = `Error: ${error.message}`;
}
});
async function downloadPart(partNumber) {
const response = await fetch(`${BASE_URL}${partNumber}.bin`);
if (!response.ok) {
throw new Error(`Failed to download part ${partNumber}: ${response.statusText}`);
}
return response.arrayBuffer();
}
// If you want to use Web Workers for better performance,
// you can implement a worker script and manage the download tasks there.
// However, for simplicity, we'll stick with the main thread here.
</script>
</body>
</html>
结尾
2024年,对于许多资源大佬而言,是一个不算好的年。E5崩了,onedrive开始割韮菜,各大网盘也开始整活,加强了API防护与资源审查,国内做种环境变差的同时还有某雷吸血。各位大佬在改后缀名、不断压缩与hash混淆中与各大网盘斗智斗勇,而各位"贫民"在与网盘限速、找解压密码和工具中过得水深火热
我希望,2025年是一个各位大佬不被封号和不再炸链的一年,是一个各位"贫民"轻松下gal的一年,是一个让所有人都能玩gal的一年。这是我引入ipfs技术的原因。虽然目前方案并不成熟,但是我相信在各位大佬的帮助下,我们一定可以建造更美好的未来。
最后,祝大家新年快乐!同时谢谢过去一年因无私分享而付出努力的大佬们!