|
|
|
|
@ -49,8 +49,14 @@ export function getMinioClient() { |
|
|
|
|
*/ |
|
|
|
|
export async function uploadFile(bucket, objectName, file, metaData = {}, onProgress) { |
|
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
|
// 检查 MinIO 客户端是否初始化
|
|
|
|
|
if (!s3Client) { |
|
|
|
|
return reject(new Error('MinIO client not initialized')) |
|
|
|
|
console.error('❌ MinIO client not initialized, attempting fallback upload...') |
|
|
|
|
|
|
|
|
|
// 回退到使用 HTTP 表单上传
|
|
|
|
|
return fallbackUpload(bucket, objectName, file, metaData, onProgress) |
|
|
|
|
.then(resolve) |
|
|
|
|
.catch(reject) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
console.log('=== MinIO Upload ===') |
|
|
|
|
@ -90,9 +96,82 @@ export async function uploadFile(bucket, objectName, file, metaData = {}, onProg |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
.catch((err) => { |
|
|
|
|
console.error('❌ Upload failed:', err) |
|
|
|
|
reject(new Error('Upload failed: ' + err.message)) |
|
|
|
|
console.error('❌ AWS SDK Upload failed:', err) |
|
|
|
|
console.log('Attempting fallback upload...') |
|
|
|
|
|
|
|
|
|
// 尝试回退上传
|
|
|
|
|
fallbackUpload(bucket, objectName, file, metaData, onProgress) |
|
|
|
|
.then(resolve) |
|
|
|
|
.catch((fallbackErr) => { |
|
|
|
|
reject(new Error('Upload failed: ' + fallbackErr.message)) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 回退上传方法 - 使用 HTTP POST 表单上传 |
|
|
|
|
* @param {string} bucket - 存储桶名称 |
|
|
|
|
* @param {string} objectName - 对象名称 |
|
|
|
|
* @param {File} file - 文件对象 |
|
|
|
|
* @param {object} metaData - 元数据 |
|
|
|
|
* @param {function} onProgress - 进度回调 |
|
|
|
|
* @returns {Promise} - 上传结果 |
|
|
|
|
*/ |
|
|
|
|
async function fallbackUpload(bucket, objectName, file, metaData, onProgress) { |
|
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
|
const config = window._globalConfig || {} |
|
|
|
|
const uploadUrl = config.MINIO_UPLOAD_URL || '/api/upload/minio' |
|
|
|
|
|
|
|
|
|
console.log('=== Fallback Upload ===') |
|
|
|
|
console.log('Upload URL:', uploadUrl) |
|
|
|
|
console.log('Bucket:', bucket) |
|
|
|
|
console.log('Object:', objectName) |
|
|
|
|
|
|
|
|
|
const formData = new FormData() |
|
|
|
|
formData.append('bucket', bucket) |
|
|
|
|
formData.append('objectName', objectName) |
|
|
|
|
formData.append('file', file, file.name) |
|
|
|
|
|
|
|
|
|
// 添加元数据
|
|
|
|
|
for (const key in metaData) { |
|
|
|
|
formData.append('meta_' + key, metaData[key]) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const xhr = new XMLHttpRequest() |
|
|
|
|
|
|
|
|
|
xhr.upload.addEventListener('progress', (event) => { |
|
|
|
|
if (event.lengthComputable && onProgress) { |
|
|
|
|
const percent = Math.round((event.loaded / event.total) * 100) |
|
|
|
|
onProgress(percent) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
xhr.addEventListener('load', () => { |
|
|
|
|
try { |
|
|
|
|
const response = JSON.parse(xhr.responseText) |
|
|
|
|
if (xhr.status >= 200 && xhr.status < 300) { |
|
|
|
|
console.log('✅ Fallback upload successful:', response) |
|
|
|
|
resolve({ |
|
|
|
|
bucket, |
|
|
|
|
objectName: response.objectName || objectName, |
|
|
|
|
etag: response.etag, |
|
|
|
|
url: response.url || `${uploadUrl}/${bucket}/${objectName}` |
|
|
|
|
}) |
|
|
|
|
} else { |
|
|
|
|
reject(new Error(response.message || 'Upload failed')) |
|
|
|
|
} |
|
|
|
|
} catch (e) { |
|
|
|
|
reject(new Error('Failed to parse response: ' + e.message)) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
xhr.addEventListener('error', () => { |
|
|
|
|
reject(new Error('Network error during upload')) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
xhr.open('POST', uploadUrl, true) |
|
|
|
|
xhr.send(formData) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|