改进: 增强上传工具下载的可靠性和错误提示

问题背景:
- 用户反馈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 <noreply@anthropic.com>
This commit is contained in:
2025-11-12 20:05:43 +08:00
parent 136d45dee7
commit 0fc378576f

View File

@@ -1286,11 +1286,18 @@ build_upload_tool() {
cd "${PROJECT_DIR}/upload-tool"
# 检查是否已存在可执行文件
if [[ -f "dist/玩玩云上传工具.exe" ]] || [[ -f "dist/玩玩云上传工具" ]]; then
print_success "上传工具已存在,跳过下载"
# 检查是否已存在可执行文件并验证大小
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,23 +1307,25 @@ build_upload_tool() {
TOOL_DOWNLOAD_URL="http://a.haory.top/e/e82/玩玩云上传工具.exe"
TOOL_FILENAME="玩玩云上传工具.exe"
print_info "正在下载上传工具..."
print_info "正在下载上传工具约43MB可能需要1-2分钟..."
# 尝试下载最多3次重试
DOWNLOAD_SUCCESS=false
for attempt in 1 2 3; do
print_info "尝试下载 ($attempt/3)..."
# 尝试下载
if command -v wget &> /dev/null; then
wget -q --show-progress -O "dist/${TOOL_FILENAME}" "$TOOL_DOWNLOAD_URL" || {
print_warning "上传工具下载失败"
print_info "用户仍可使用网页上传本地存储或SFTP客户端"
echo ""
return 0
}
# 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 -L -o "dist/${TOOL_FILENAME}" "$TOOL_DOWNLOAD_URL" || {
print_warning "上传工具下载失败"
print_info "用户仍可使用网页上传本地存储或SFTP客户端"
echo ""
return 0
}
# 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客户端"
@@ -1324,13 +1333,38 @@ build_upload_tool() {
return 0
fi
# 添加执行权限Linux版本
if [[ "$TOOL_FILENAME" != *.exe ]]; then
chmod +x "dist/${TOOL_FILENAME}"
# 如果不是最后一次尝试,等待后重试
if [[ $attempt -lt 3 ]]; then
print_warning "下载失败5秒后重试..."
sleep 5
fi
done
print_success "上传工具下载完成: dist/${TOOL_FILENAME}"
# 验证下载结果
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 ""
fi
else
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 ""
fi
}
configure_nginx() {