platform-vue/docs/七牛云区域配置修复说明.md

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. 测试上传

  1. 登录系统
  2. 进入软件升级页面
  3. 上传一个文件
  4. 观察是否成功

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.go
    • GetUploadToken() 方法返回 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 依赖已安装
  • 创建测试文档

⏭️ 下一步

  • 重启后端服务
  • 测试文件上传功能
  • 验证区域配置正确