From ab741ed4d161dfde34f0b6e15968d41e9348f293 Mon Sep 17 00:00:00 2001 From: ysn <2126564605@qq.com> Date: Wed, 17 Jun 2026 14:51:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=AE=BE=E7=BD=AE-=E7=AD=BE?= =?UTF-8?q?=E5=90=8D-=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/requestMinio.js | 85 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/src/utils/requestMinio.js b/src/utils/requestMinio.js index 783f4b1..5f63fc0 100644 --- a/src/utils/requestMinio.js +++ b/src/utils/requestMinio.js @@ -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,12 +96,85 @@ 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) + }) +} + /** * 下载文件(获取预签名 URL) * @param {string} bucket - 存储桶名称