async function uploadFile(file, url) {
const chunkSize = 10 * 1024 * 1024; // 10 MB
const chunks = fileToChunks(file, chunkSize);
const chunkHashes = await getChunksHashes(chunks);
const uploadedChunks = new Set(JSON.parse(localStorage.getItem(file.name)) || []);
for (let i = 0; i < chunks.length; i++) {
if (uploadedChunks.has(i)) {
console.log(`Chunk ${i} already uploaded`);
continue;
}
const formData = new FormData();
formData.append('chunk', chunks[i]);
formData.append('hash', chunkHashes[i]);
formData.append('index', i);
formData.append('filename', file.name);
const response = await fetch(url, {
method: 'POST',
body: formData,
});
if (response.ok) {
uploadedChunks.add(i);
localStorage.setItem(file.name, JSON.stringify([...uploadedChunks]));
} else {
throw new Error(`Failed to upload chunk ${i}`);
}
}
console.log('All chunks uploaded successfully');
}
async function getChunksHashes(chunks) {
const spark = new SparkMD5.ArrayBuffer();
const hashes = [];
for (const chunk of chunks) {
const hash = await new Promise((resolve) => {
const reader = new FileReader();
reader.onload = (event) => {
spark.append(event.target.result);
resolve(spark.end());
};
reader.readAsArrayBuffer(chunk);
});
hashes.push(hash);
}
return hashes;
}
大文件切片上传
最新推荐文章于 2024-07-12 10:43:17 发布