前端大文件上传
fetch("./fe3af85b9cf6201c415122532d3cc0ca.jpg").then((data) => {
data.blob().then((data) => {
handleUpload(data);
});
});
const spark = new SparkMD5.ArrayBuffer();
const handleUpload = async (file, chunkSize = 100 * 1024) => {
const fileArrayBuffer = await file.arrayBuffer();
const completeFileHash = SparkMD5.ArrayBuffer.hash(fileArrayBuffer);
const chunkNumber = Math.ceil(file.size / chunkSize);
for (let p = 0; p < chunkNumber; p++) {
const chunkFile = file.slice(p * chunkSize, (p + 1) * chunkSize);
const data = await uploadItem(chunkFile);
const currentPercent = ((p + 1) / chunkNumber) * 100;
spark.append(data);
}
console.log(completeFileHash, spark.end());
};
const uploadItem = (file) => {
return fetchWithRetry("url", file)
.then(async () => {
const data = await file.arrayBuffer();
return Promise.resolve(data);
})
.catch((err) => {
confirm(err);
return Promise.reject(err);
});
};
async function fetchWithRetry(url, data, maxRetries = 3) {
let retries = 0;
const formData = new FormData();
formData.append("file", data);
const options = {
method: "post",
body: formData,
};
while (retries < maxRetries) {
try {
const response = await fetch(url, options).then((res) => {
if (!res.ok) {
return Promise.reject("err");
}
});
return response;
} catch (error) {
retries++;
}
}
throw new Error("Max retries reached.");
}