mirror of
https://github.com/wgh136/nysoure.git
synced 2025-09-27 12:17:24 +00:00
Calculate md5 checksum when finishing uploading.
This commit is contained in:
@@ -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);
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user