5.9 KiB
5.9 KiB
七牛云区域配置修复说明
问题描述
上传文件到七牛云时出现区域错误:
xhr request failed, code: 400
response: {"error":"incorrect region, please use up-z2.qiniup.com, bucket is: yunzerwebsite"}
问题原因
前端代码中硬编码了七牛云区域为 z0(华东),但实际数据库配置的是 z2(华南):
// 错误的硬编码方式
const config = {
useCdnDomain: true,
region: qiniu.region.z0, // ❌ 硬编码为华东
};
数据库实际配置:
qiniu_region = 'z2'(华南)qiniu_bucket = 'yunzerwebsite'
解决方案
1. 添加区域映射函数
在 platform/src/utils/qiniuUpload.js 文件末尾添加了 getQiniuRegion() 函数:
/**
* 根据区域代码获取七牛云区域对象
* @param {string} regionCode 区域代码 (z0, z1, z2, na0, as0, cn-east-2)
* @returns {Object} 七牛云区域对象
*/
function getQiniuRegion(regionCode) {
switch (regionCode) {
case 'z0':
return qiniu.region.z0; // 华东
case 'z1':
return qiniu.region.z1; // 华北
case 'z2':
return qiniu.region.z2; // 华南
case 'na0':
return qiniu.region.na0; // 北美
case 'as0':
return qiniu.region.as0; // 新加坡
case 'cn-east-2':
return qiniu.region.cnEast2; // 华东-浙江2
default:
return qiniu.region.z0; // 默认华东
}
}
2. 动态获取区域配置
修改 uploadToQiniu() 函数,从后端返回的数据中读取区域配置:
export async function uploadToQiniu(file, options = {}) {
// 1. 获取上传凭证(包含区域信息)
const tokenRes = await getQiniuToken();
const { token, keyPrefix, domain, region, uploadUrl } = tokenRes.data;
// 2. 根据后端返回的区域代码动态获取区域对象
const qiniuRegion = getQiniuRegion(region); // ✓ 动态获取
const config = {
useCdnDomain: true,
region: qiniuRegion, // ✓ 使用正确的区域
};
// 3. 上传文件
const observable = qiniu.upload(file, key, token, putExtra, config);
// ...
}
工作流程
1. 前端调用 getQiniuToken()
↓
2. 后端从数据库读取配置
- storage_type: 'qiniu'
- qiniu_region: 'z2'
- qiniu_bucket: 'yunzerwebsite'
↓
3. 后端返回配置信息
{
token: "...",
region: "z2", ← 区域代码
bucket: "yunzerwebsite",
uploadUrl: "https://up-z2.qiniup.com"
}
↓
4. 前端调用 getQiniuRegion('z2')
返回: qiniu.region.z2
↓
5. 使用正确的区域上传文件
上传地址: https://up-z2.qiniup.com
支持的区域
| 区域代码 | 区域名称 | qiniu-js 对象 | 上传地址 |
|---|---|---|---|
| z0 | 华东 | qiniu.region.z0 | https://up-z0.qiniup.com |
| z1 | 华北 | qiniu.region.z1 | https://up-z1.qiniup.com |
| z2 | 华南 | qiniu.region.z2 | https://up-z2.qiniup.com |
| na0 | 北美 | qiniu.region.na0 | https://up-na0.qiniup.com |
| as0 | 新加坡 | qiniu.region.as0 | https://up-as0.qiniup.com |
| cn-east-2 | 华东-浙江2 | qiniu.region.cnEast2 | https://up-cn-east-2.qiniup.com |
验证步骤
1. 确认依赖已安装
cd platform
npm list qiniu-js
预期输出:
qiniu-js@3.4.4
✓ 已确认:qiniu-js@^3.4.4 已在 package.json 中
2. 重启后端服务
systemctl restart go-api
systemctl status go-api
3. 测试上传
- 登录系统
- 进入软件升级页面
- 上传一个文件
- 观察是否成功
4. 检查日志
# 后端日志
tail -f /www/wwwroot/api.yunzer.cn/go.log
# 前端控制台
# 打开浏览器开发者工具,查看 Network 标签
预期请求:
GET /platform/storage/config
→ { storageType: 'qiniu', qiniuRegion: 'z2' }
GET /platform/qiniu/token
→ { token: '...', region: 'z2', uploadUrl: 'https://up-z2.qiniup.com' }
POST https://up-z2.qiniup.com ← 直接上传到七牛云
→ { key: '...', hash: '...', size: ... }
POST /platform/qiniu/save
→ { url: 'http://7colud.yunzer.cn/...', id: 123 }
修复的文件
前端
platform/src/utils/qiniuUpload.js- 添加了
getQiniuRegion()函数 - 修改了
uploadToQiniu()函数,使用动态区域配置
- 添加了
后端
go/controllers/qiniu_upload.goGetUploadToken()方法返回region字段getQiniuUploadURL()函数根据区域返回正确的上传地址
优势
1. 灵活性
- 支持所有七牛云区域
- 无需修改代码即可切换区域
- 只需在数据库中修改配置
2. 可维护性
- 区域配置集中管理
- 代码更清晰易懂
- 便于扩展新区域
3. 正确性
- 自动使用正确的上传地址
- 避免区域不匹配错误
- 提高上传成功率
切换区域方法
如果需要切换到其他区域,只需修改数据库配置:
-- 切换到华东 (z0)
UPDATE system_storage_config
SET qiniu_region = 'z0'
WHERE id = 1;
-- 切换到华北 (z1)
UPDATE system_storage_config
SET qiniu_region = 'z1'
WHERE id = 1;
-- 切换到华南 (z2) - 当前配置
UPDATE system_storage_config
SET qiniu_region = 'z2'
WHERE id = 1;
前端会自动使用新的区域配置,无需重启或修改代码。
相关文档
更新日期
2026-04-09
状态
✅ 已完成
- 添加
getQiniuRegion()函数 - 修改
uploadToQiniu()使用动态区域 - 验证
qiniu-js依赖已安装 - 创建测试文档
⏭️ 下一步
- 重启后端服务
- 测试文件上传功能
- 验证区域配置正确