From 0fc378576f6f0fac4b0982be918a4467b0738982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=BB=E5=8B=87=E7=A5=A5?= <237899745@qq.com> Date: Wed, 12 Nov 2025 20:05:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B:=20=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=B7=A5=E5=85=B7=E4=B8=8B=E8=BD=BD=E7=9A=84?= =?UTF-8?q?=E5=8F=AF=E9=9D=A0=E6=80=A7=E5=92=8C=E9=94=99=E8=AF=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题背景: - 用户反馈SFTP模式下载上传工具失败,浏览器无反应 - 服务器日志显示: [上传工具] exe文件不存在 - 安装脚本显示"安装成功",但exe实际下载失败 - 原因:下载失败但脚本继续执行(return 0),用户未注意到警告 改进内容: 1. 添加重试机制 - 最多重试3次 - 每次失败后等待5秒 - 显示当前尝试次数 2. 增加超时时间 - wget: --timeout=300 (5分钟) - curl: --max-time 300 (5分钟) - 避免下载43MB文件时超时 3. 文件大小验证 - 下载前:检查现有文件大小,异常则重新下载 - 下载后:验证文件至少30MB(正常42MB) - 文件过小则删除并提示错误 4. 改进错误提示 - 下载中:显示文件大小和预计时间 - 失败时:列出可能的原因 - 提供手动下载链接和路径 5. 进度显示优化 - 显示当前尝试次数 - 显示文件大小(MB) - wget添加 --no-check-certificate 避免证书问题 测试场景: ✅ 正常下载(文件不存在) ✅ 跳过下载(文件已存在且大小正常) ✅ 重新下载(文件存在但大小异常) ✅ 网络失败重试(最多3次) ✅ 下载超时处理(5分钟超时) 用户体验: - 明确知道下载进度 - 失败时有详细的错误信息和解决方案 - 不会误以为安装成功但功能不可用 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- install.sh | 86 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/install.sh b/install.sh index 931c6a1..5a9a0ee 100644 --- a/install.sh +++ b/install.sh @@ -1286,11 +1286,18 @@ build_upload_tool() { cd "${PROJECT_DIR}/upload-tool" - # 检查是否已存在可执行文件 - if [[ -f "dist/玩玩云上传工具.exe" ]] || [[ -f "dist/玩玩云上传工具" ]]; then - print_success "上传工具已存在,跳过下载" - echo "" - return 0 + # 检查是否已存在可执行文件并验证大小 + if [[ -f "dist/玩玩云上传工具.exe" ]]; then + FILE_SIZE=$(stat -f%z "dist/玩玩云上传工具.exe" 2>/dev/null || stat -c%s "dist/玩玩云上传工具.exe" 2>/dev/null || echo "0") + if [[ $FILE_SIZE -gt 30000000 ]]; then + FILE_SIZE_MB=$(( FILE_SIZE / 1024 / 1024 )) + print_success "上传工具已存在(${FILE_SIZE_MB}MB),跳过下载" + echo "" + return 0 + else + print_warning "现有文件大小异常(${FILE_SIZE}字节),重新下载..." + rm -f "dist/玩玩云上传工具.exe" + fi fi # 创建dist目录 @@ -1300,37 +1307,64 @@ build_upload_tool() { TOOL_DOWNLOAD_URL="http://a.haory.top/e/e82/玩玩云上传工具.exe" TOOL_FILENAME="玩玩云上传工具.exe" - print_info "正在下载上传工具..." + print_info "正在下载上传工具(约43MB,可能需要1-2分钟)..." - # 尝试下载 - if command -v wget &> /dev/null; then - wget -q --show-progress -O "dist/${TOOL_FILENAME}" "$TOOL_DOWNLOAD_URL" || { - print_warning "上传工具下载失败" + # 尝试下载(最多3次重试) + DOWNLOAD_SUCCESS=false + for attempt in 1 2 3; do + print_info "尝试下载 ($attempt/3)..." + + if command -v wget &> /dev/null; then + # wget: 超时300秒,重试3次 + if wget --timeout=300 --tries=3 --no-check-certificate -q --show-progress -O "dist/${TOOL_FILENAME}" "$TOOL_DOWNLOAD_URL" 2>&1; then + DOWNLOAD_SUCCESS=true + break + fi + elif command -v curl &> /dev/null; then + # curl: 连接超时60秒,总超时300秒 + if curl --connect-timeout 60 --max-time 300 -L -# -o "dist/${TOOL_FILENAME}" "$TOOL_DOWNLOAD_URL" 2>&1; then + DOWNLOAD_SUCCESS=true + break + fi + else + print_warning "未找到wget或curl,无法下载上传工具" print_info "用户仍可使用网页上传(本地存储)或SFTP客户端" echo "" return 0 - } - elif command -v curl &> /dev/null; then - curl -L -o "dist/${TOOL_FILENAME}" "$TOOL_DOWNLOAD_URL" || { - print_warning "上传工具下载失败" + fi + + # 如果不是最后一次尝试,等待后重试 + if [[ $attempt -lt 3 ]]; then + print_warning "下载失败,5秒后重试..." + sleep 5 + fi + done + + # 验证下载结果 + if [[ "$DOWNLOAD_SUCCESS" == "true" ]] && [[ -f "dist/${TOOL_FILENAME}" ]]; then + FILE_SIZE=$(stat -f%z "dist/${TOOL_FILENAME}" 2>/dev/null || stat -c%s "dist/${TOOL_FILENAME}" 2>/dev/null || echo "0") + FILE_SIZE_MB=$(( FILE_SIZE / 1024 / 1024 )) + + if [[ $FILE_SIZE -gt 30000000 ]]; then + print_success "上传工具下载完成: ${FILE_SIZE_MB}MB" + echo "" + else + print_error "下载的文件大小异常(${FILE_SIZE}字节),可能下载不完整" + rm -f "dist/${TOOL_FILENAME}" + print_warning "可手动下载: ${TOOL_DOWNLOAD_URL}" print_info "用户仍可使用网页上传(本地存储)或SFTP客户端" echo "" - return 0 - } + fi else - print_warning "未找到wget或curl,无法下载上传工具" + print_error "上传工具下载失败(已重试3次)" + print_warning "可能的原因:" + echo " 1. 网络连接问题或下载速度过慢" + echo " 2. CDN链接不可访问: ${TOOL_DOWNLOAD_URL}" + echo " 3. 防火墙拦截HTTP连接" + print_info "您可以稍后手动下载并放置到: ${PROJECT_DIR}/upload-tool/dist/" print_info "用户仍可使用网页上传(本地存储)或SFTP客户端" echo "" - return 0 fi - - # 添加执行权限(Linux版本) - if [[ "$TOOL_FILENAME" != *.exe ]]; then - chmod +x "dist/${TOOL_FILENAME}" - fi - - print_success "上传工具下载完成: dist/${TOOL_FILENAME}" - echo "" } configure_nginx() {