4.9 KiB
4.9 KiB
🚀 立即修复文件上传 - 操作指南
✅ 已完成的修复
我已经修复了导致文件上传失败的代码 bug:
修改文件
- ✅
src/server/modules/S3/index.ts- 添加 URL 替换逻辑 - ✅
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
✨ 测试上传功能
-
打开应用: http://192.168.1.83:3210
-
打开开发者工具: F12 → Network 标签
-
上传文件: 尝试上传一个图片或文档
-
检查请求:
- 找到失败的 PUT 请求
- 查看 Request URL
- 修复前:
http://host.docker.internal:9002/...❌ - 修复后:
http://192.168.1.83:9002/...✅
-
验证成功: 文件上传成功,可以在聊天中看到
🔍 如果仍然失败
快速诊断
./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
📊 验证清单
- Docker 镜像重新构建成功
- 容器启动成功 (
docker ps显示 lingjingwanxiang) - MinIO 运行正常 (
docker ps显示 lingjingwanxiang-minio) - 可以访问应用 (http://192.168.1.83:3210)
- 可以访问 MinIO (http://192.168.1.83:9002/lingjingwanxiang/)
- 文件上传成功
- 上传的文件可以在聊天中显示
📁 相关文件说明
| 文件 | 用途 |
|---|---|
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 的网络机制。
🆘 需要帮助?
如果按照上述步骤仍然失败,请提供:
- 浏览器控制台错误 (F12 → Console)
- 网络请求详情 (F12 → Network → 失败的请求)
- 容器日志:
docker logs lingjingwanxiang > app.log docker logs lingjingwanxiang-minio > minio.log - 诊断结果:
./test-upload.sh > diagnostic.log
修复完成后,请删除此文件或移至文档目录。