Files
ljwx-chat/立即修复文件上传.md
2025-11-29 07:36:44 +08:00

4.9 KiB

🚀 立即修复文件上传 - 操作指南

✅ 已完成的修复

我已经修复了导致文件上传失败的代码 bug:

修改文件

  1. ✅ src/server/modules/S3/index.ts - 添加 URL 替换逻辑
  2. ✅ src/server/modules/S3/index.test.ts - 添加测试用例

修复内容

预签名 URL 现在会自动将内部地址 (host.docker.internal:9002) 替换为公网地址 (192.168.1.83:9002), 使浏览器可以访问。

🔧 立即应用修复 (3 步)

方法 A: 一键修复 (最简单)

./rebuild-and-restart.sh

等待 5-10 分钟,完成!


方法 B: 手动修复 (可控)

步骤 1: 停止当前容器

docker-compose -f docker-compose.lingjingwanxiang.yml down

步骤 2: 重新构建 Docker 镜像

# 如果网络较快
docker build -t lingjingwanxiang:latest .

# 如果网络较慢,使用代理
./build-docker-with-proxy.sh

注意: 构建需要 5-10 分钟,请耐心等待。

步骤 3: 启动容器

docker-compose -f docker-compose.lingjingwanxiang.yml up -d

步骤 4: 验证

# 查看日志
docker logs -f lingjingwanxiang

# 等待看到类似信息:
# ▲ Next.js 15.x.x
# - Local:        http://localhost:3210
# - ready started server on 0.0.0.0:3210

✨ 测试上传功能

  1. 打开应用: http://192.168.1.83:3210

  2. 打开开发者工具: F12 → Network 标签

  3. 上传文件: 尝试上传一个图片或文档

  4. 检查请求:

    • 找到失败的 PUT 请求
    • 查看 Request URL
    • 修复前: http://host.docker.internal:9002/... ❌
    • 修复后: http://192.168.1.83:9002/... ✅
  5. 验证成功: 文件上传成功,可以在聊天中看到

🔍 如果仍然失败

快速诊断

./test-upload.sh

查看输出,所有项目应该显示 ✓。

常见问题

1. 构建失败

# 查看构建日志
docker build -t lingjingwanxiang:latest . 2>&1 | tee build.log

# 检查磁盘空间
df -h

# 清理旧镜像
docker system prune -a

2. 容器启动失败

# 查看容器日志
docker logs lingjingwanxiang

# 检查端口占用
lsof -i :3210

# 检查环境变量
docker exec lingjingwanxiang printenv | grep S3

3. MinIO 无法访问

# 测试 MinIO
curl http://192.168.1.83:9002/minio/health/live

# 查看 MinIO 日志
docker logs lingjingwanxiang-minio

# 重启 MinIO
docker-compose -f docker-compose.minio.yml restart

4. CORS 错误

# 重新配置 CORS
./setup-minio.sh

# 或手动配置
# 访问 http://localhost:9003
# 登录: minioadmin / minioadmin
# Buckets → lingjingwanxiang → Configuration
# 设置 Anonymous Access 为 public

📊 验证清单

📁 相关文件说明

文件 用途
rebuild-and-restart.sh 一键重建和重启脚本
test-upload.sh 上传功能诊断工具
文件上传问题修复.md 详细的技术说明
文件上传故障排查.md 完整的故障排查指南
start-all.sh 启动所有服务
stop-all.sh 停止所有服务

🎯 预期结果

修复后,文件上传流程:

用户选择文件
    ↓
浏览器请求预签名 URL
    ↓
服务端生成: http://host.docker.internal:9002/...
    ↓
自动替换为: http://192.168.1.83:9002/...  ← 修复在这里!
    ↓
返回给浏览器
    ↓
浏览器上传到 MinIO (192.168.1.83:9002)
    ↓
✅ 上传成功!

💡 技术解释 (可选阅读)

为什么会失败?

Docker 容器内部使用 host.docker.internal 访问 host 上的 MinIO, 但浏览器在 host 上,无法解析这个特殊域名。

修复做了什么?

在生成预签名 URL 后,自动将内部地址替换为外部地址:

  • 内部: http://host.docker.internal:9002
  • 外部: http://192.168.1.83:9002

为什么不直接用外部地址?

因为容器内部必须通过 host.docker.internal 才能访问 host 服务,这是 Docker 的网络机制。

🆘 需要帮助?

如果按照上述步骤仍然失败,请提供:

  1. 浏览器控制台错误 (F12 → Console)
  2. 网络请求详情 (F12 → Network → 失败的请求)
  3. 容器日志:
    docker logs lingjingwanxiang > app.log
    docker logs lingjingwanxiang-minio > minio.log
    
  4. 诊断结果:
    ./test-upload.sh > diagnostic.log
    

修复完成后,请删除此文件或移至文档目录。