Calculate md5 checksum when finishing uploading.

This commit is contained in:
nyne
2025-05-16 18:16:19 +08:00
parent 4d03955703
commit 271cde9e1e
6 changed files with 53 additions and 53 deletions

View File

@@ -520,7 +520,7 @@ class Network {
}
async initFileUpload(filename: string, description: string, fileSize: number,
resourceId: number, storageId: number, md5: string): Promise<Response<UploadingFile>> {
resourceId: number, storageId: number): Promise<Response<UploadingFile>> {
try {
const response = await axios.post(`${this.apiBaseUrl}/files/upload/init`, {
filename,
@@ -528,7 +528,6 @@ class Network {
file_size: fileSize,
resource_id: resourceId,
storage_id: storageId,
md5
});
return response.data;
} catch (e: any) {
@@ -561,9 +560,9 @@ class Network {
}
}
async finishFileUpload(fileId: number): Promise<Response<RFile>> {
async finishFileUpload(fileId: number, md5: string): Promise<Response<RFile>> {
try {
const response = await axios.post(`${this.apiBaseUrl}/files/upload/finish/${fileId}`);
const response = await axios.post(`${this.apiBaseUrl}/files/upload/finish/${fileId}?md5=${md5}`);
return response.data;
} catch (e: any) {
console.error(e);

View File

@@ -58,6 +58,33 @@ export class UploadingTask extends Listenable {
this.onFinished = onFinished;
}
async calculateMd5(file: File): Promise<string> {
return new Promise((resolve, reject) => {
const reader = new FileReader();
const spark = new SparkMD5.ArrayBuffer();
const chunkSize = 4 * 1024 * 1024;
let offset = 0;
reader.onload = (e) => {
spark.append(e.target!.result as ArrayBuffer);
offset += chunkSize;
if (offset < file.size) {
readSlice(offset);
} else {
resolve(spark.end());
}
};
reader.onerror = (e) => {
reject(e);
};
const readSlice = (o: number) => {
const end = o + chunkSize >= file.size ? file.size : o + chunkSize;
const slice = file.slice(o, end);
reader.readAsArrayBuffer(slice);
};
readSlice(0);
});
}
async upload() {
let index = 0;
while (index < this.blocks.length) {
@@ -108,7 +135,17 @@ export class UploadingTask extends Listenable {
if (this.status !== UploadingStatus.UPLOADING) {
return;
}
const res = await network.finishFileUpload(this.id);
let md5 = "";
try {
md5 = await this.calculateMd5(this.file);
}
catch (e) {
this.status = UploadingStatus.ERROR;
this.errorMessage = "Failed to calculate md5";
this.notifyListeners();
return;
}
const res = await network.finishFileUpload(this.id, md5);
if (res.success) {
this.status = UploadingStatus.DONE;
this.notifyListeners();
@@ -150,43 +187,12 @@ class UploadingManager extends Listenable {
}
async addTask(file: File, resourceID: number, storageID: number, description: string, onFinished: () => void): Promise<Response<void>> {
// Calculate hash of the file
async function calculateMd5(file: File): Promise<string> {
return new Promise((resolve, reject) => {
const reader = new FileReader();
const spark = new SparkMD5.ArrayBuffer();
const chunkSize = 4 * 1024 * 1024;
let offset = 0;
reader.onload = (e) => {
spark.append(e.target!.result as ArrayBuffer);
offset += chunkSize;
if (offset < file.size) {
readSlice(offset);
} else {
resolve(spark.end());
}
};
reader.onerror = (e) => {
reject(e);
};
const readSlice = (o: number) => {
const end = o + chunkSize >= file.size ? file.size : o + chunkSize;
const slice = file.slice(o, end);
reader.readAsArrayBuffer(slice);
};
readSlice(0);
});
}
const md5 = await calculateMd5(file);
const res = await network.initFileUpload(
file.name,
description,
file.size,
resourceID,
storageID,
md5,
)
if (!res.success) {
return {