From 066e8ba4d99075ef2827696211640a2378b9cfc7 Mon Sep 17 00:00:00 2001 From: yorn <1057707203@qq.com> Date: Tue, 12 Aug 2025 16:26:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E4=BB=B6=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E8=BF=9B=E5=BA=A6=E6=9D=A1=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config/api-config.ts | 16 +++++----- app/routes/files.upload.tsx | 61 +++++++++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/app/config/api-config.ts b/app/config/api-config.ts index af96e69..66e18ca 100644 --- a/app/config/api-config.ts +++ b/app/config/api-config.ts @@ -73,9 +73,9 @@ const portConfigs: Record> = { // 主要 // 梅州 '51703': { - baseUrl: 'http://172.16.0.55:8000', - documentUrl: 'http://172.16.0.55:8000/docauditai/', - uploadUrl: 'http://172.16.0.55:8000/admin/documents' + baseUrl: 'http://10.79.97.17:8000', + documentUrl: 'http://10.79.97.17:8000/docauditai/', + uploadUrl: 'http://10.79.97.17:8000/admin/documents' }, @@ -139,12 +139,12 @@ const configs: Record = { // 测试环境 testing: { - baseUrl: 'http://172.16.0.55:8000', + baseUrl: 'http://172.16.0.55:8008', // baseUrl: 'http://172.16.0.81:3000', // baseUrl: 'http://nas.7bm.co:3000', // documentUrl: 'http://172.16.0.81:9000/docauditai/', - documentUrl: 'http://172.16.0.55:8000/docauditai/', - uploadUrl: 'http://172.16.0.55:8000/admin/documents', + documentUrl: 'http://172.16.0.55:8008/docauditai/', + uploadUrl: 'http://172.16.0.55:8008/admin/documents', // uploadUrl: 'http://172.16.0.58:8008/admin/documents', // uploadUrl: 'http://172.16.0.58:8008/admin/documents', oauth: { @@ -169,7 +169,7 @@ const configs: Record = { serverUrl: 'http://10.79.112.85', // IDaaS服务器地址 clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', // 需要替换为实际的Client Secret - redirectUri: 'http://10.79.97.17:51703/callback', // 回调地址 + redirectUri: 'http://10.79.97.17/', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 } }, @@ -320,7 +320,7 @@ const getCurrentConfig = (): ApiConfig => { // 如果有端口特定配置,则合并配置 if (port && portConfigs[port]) { console.log(`🔧 使用端口特定配置: ${port}`, portConfigs[port]); - defaultConfig = { + defaultConfig = { ...defaultConfig, ...portConfigs[port], // 保持oauth配置不变,只覆盖API相关配置 diff --git a/app/routes/files.upload.tsx b/app/routes/files.upload.tsx index f2795c9..f8e5d24 100644 --- a/app/routes/files.upload.tsx +++ b/app/routes/files.upload.tsx @@ -946,20 +946,22 @@ export default function FilesUpload() { const startTime = Date.now(); let lastUploadedSize = 0; + let lastUpdateTime = startTime; uploadProgressIntervalRef.current = setInterval(() => { const currentTime = Date.now(); - const timeElapsed = (currentTime - startTime) / 1000; // 转换为秒 - const currentSpeed = (uploadedSize - lastUploadedSize) / timeElapsed; // 字节/秒 + const timeElapsed = (currentTime - lastUpdateTime) / 1000; // 使用最近一次更新的时间间隔 + const currentSpeed = timeElapsed > 0 ? (uploadedSize - lastUploadedSize) / timeElapsed : 0; // 字节/秒 lastUploadedSize = uploadedSize; + lastUpdateTime = currentTime; // 更新上传速度显示 setUploadSpeed(`${formatFileSize(currentSpeed)}/s`); - // 更新进度 - const progress = (uploadedSize / totalSize) * 100; - setUploadProgress(progress); - }, 1000); + // 更新进度 - 保留2位小数 + const progress = Math.min((uploadedSize / totalSize) * 100, 99.99); + setUploadProgress(parseFloat(progress.toFixed(2))); + }, 200); // 改为200ms更新一次,提供更准确的速度计算 // 上传所有文件 const uploadedFiles: UploadedFile[] = []; @@ -997,6 +999,37 @@ export default function FilesUpload() { // console.log(`【调试-startUpload】准备上传文件 ${file.name} 到服务器`); + // 创建基于时间的渐进式进度模拟 + const startUploadTime = Date.now(); + // 根据文件大小动态估算上传时间,考虑网络速度 + const estimatedUploadTime = Math.max( + file.size / (1024 * 1024) / 3 * 1000, // 假设3MB/s的速度,1MB需要1/3秒 + 1000 // 最小1秒 + ); + let progressInterval: NodeJS.Timeout | null = null; + + // 开始渐进式进度更新 + const progressPromise = new Promise((resolve) => { + progressInterval = setInterval(() => { + const elapsed = Date.now() - startUploadTime; + const progressRatio = Math.min(elapsed / estimatedUploadTime, 0.95); // 最大95% + + // 计算当前文件的进度贡献 + const fileProgress = progressRatio * file.size; + const previousFilesSize = files.slice(0, temp_n - 1).reduce((sum, f) => sum + f.size, 0); + uploadedSize = previousFilesSize + fileProgress; + + // 如果接近完成,停止进度更新并resolve + if (progressRatio >= 0.95) { + if (progressInterval) { + clearInterval(progressInterval); + progressInterval = null; + } + resolve(); + } + }, 100); // 改为100ms更新一次,提供更流畅的进度 + }); + // 使用Promise.race添加超时处理 const uploadPromise = handleFileUpload( binaryData, @@ -1015,11 +1048,19 @@ export default function FilesUpload() { const timeoutPromise = new Promise((_, reject) => { setTimeout(() => { reject(new Error('上传超时')); - }, 600000); // 30秒超时 + }, 600000); // 10分钟超时 }); - // 使用Promise.race处理超时 - const uploadResult = await Promise.race([uploadPromise, timeoutPromise]); + // 并行执行上传和进度更新 + const [uploadResult] = await Promise.all([ + Promise.race([uploadPromise, timeoutPromise]), + progressPromise + ]); + + // 清除进度定时器 + if (progressInterval) { + clearInterval(progressInterval); + } // 再次检查组件是否已卸载 if (!isMountedRef.current) { @@ -1900,7 +1941,7 @@ export default function FilesUpload() { fileName={`${currentFiles.length}个文件`} fileSize={formatFileSize(currentFiles.reduce((sum, file) => sum + file.size, 0))} progress={uploadProgress} - speed={uploadSpeed} + speed={''} /> )}