feat: add file deduplication and hash checking for uploads

- Implemented SHA-256 hashing for uploaded files to enable deduplication.
- Added CheckHash method to verify if a file with the same hash already exists.
- Updated Upload method to reuse existing media assets if a duplicate is found.
- Introduced a new hash column in the media_assets table to store file hashes.
- Enhanced the upload process to include progress tracking and hash calculation.
- Modified frontend to check for existing files before uploading and to show upload progress.
- Added vuedraggable for drag-and-drop functionality in the content editing view.
This commit is contained in:
2025-12-31 19:16:02 +08:00
parent f560b95ec0
commit 221b068a84
13 changed files with 414 additions and 184 deletions

View File

@@ -2,10 +2,49 @@ import { request } from '../utils/request';
export const commonApi = {
getOptions: () => request('/common/options'),
checkHash: (hash) => request(`/upload/check?hash=${hash}`),
upload: (file, type) => {
const formData = new FormData();
formData.append('file', file);
formData.append('type', type);
return request('/upload', { method: 'POST', body: formData });
},
uploadWithProgress: (file, type, onProgress) => {
return new Promise((resolve, reject) => {
const formData = new FormData();
formData.append('file', file);
formData.append('type', type);
const xhr = new XMLHttpRequest();
xhr.open('POST', '/v1/upload');
const token = localStorage.getItem('token');
if (token) {
xhr.setRequestHeader('Authorization', `Bearer ${token}`);
}
xhr.upload.onprogress = (event) => {
if (event.lengthComputable && onProgress) {
const percentComplete = (event.loaded / event.total) * 100;
onProgress(percentComplete);
}
};
xhr.onload = () => {
if (xhr.status >= 200 && xhr.status < 300) {
try {
const response = JSON.parse(xhr.responseText);
resolve(response);
} catch (e) {
reject(e);
}
} else {
reject(new Error(xhr.statusText || 'Upload failed'));
}
};
xhr.onerror = () => reject(new Error('Network Error'));
xhr.send(formData);
});
}
};