当前位置: 首页 > article >正文

cool-admin-midway 使用腾讯云cos上传图片

说明:在使用cool-admin这个低代码平台时,发现官方的cos上传插件有问题,总是报错 substring,故自己找解决方案,修改本地的upload方法改为云端上传。


解决方案:

  1. 安装腾讯云cos的nodeJS SDK
pnpm i cos-nodejs-sdk-v5
  1. admin-midway/src/modules/plugin/hooks/upload 目录下新建工具文件upload_cos.ts 内容如下:
const COS: any = require('cos-nodejs-sdk-v5');
import fs = require('fs');

// 定义配置接口
interface CosConfig {
  Bucket?: string;
  Region?: string;
  Prefix?: string;
}

// 定义上传参数接口
interface PutObjectParam {
  key: string;
  buffer: fs.ReadStream | Buffer;
}

class CosUtil {
  private cos;
  private Bucket: string;
  private Region: string;
  private Prefix: string;

  // 构造函数,初始化配置
  constructor(config?: CosConfig) {
    this.Bucket = config?.Bucket || 'mybucket-xxxxxx'; // 存储桶名称
    this.Region = config?.Region || 'ap-guangzhou'; // 存储桶区域
    this.Prefix = config?.Prefix || ''; // 路径前缀

    // 初始化 COS 实例
    this.cos = new COS({
      SecretId: 'xxxxxx', // 密钥id
      SecretKey: 'xxxxxx', // 密钥key
    });
  }

  // 上传文件方法
  public putObject(param: PutObjectParam): Promise<any> {
    return new Promise((resolve, reject) => {
      this.cos.putObject(
        {
          Bucket: this.Bucket, // 必须
          Region: this.Region, // 必须
          Key: param.key, // 必须
          Body: param.buffer, // 必须
        },
        (err: Error, data: any) => {
          if (err) {
            reject(err);
            return;
          }
          resolve(data);
        }
      );
    });
  }
  
  // 提取图片链接中的图片名称
  public getName(imageUrl: string): string {
    // 解析 URL
    const parsedUrl = new URL(imageUrl);

    // 获取路径部分
    const pathname = parsedUrl.pathname;

    // 提取文件名
    const imageName = pathname.split('/').pop() || '';

    return imageName;
  }
}

export default CosUtil;
  1. 修改上述目录下的index.ts文件:
// ... existing code ...
import CosUtil from './upload_cos';
// ... existing code ...

// 修改之前的上传文件代码
   /**
   * 上传文件
   * @param ctx
   * @param key 文件路径
   */
  async upload(ctx: any) {
    const { domain } = this.pluginInfo.config;
    const uploadUtil = new CosUtil();
    try {
      const { key } = ctx.fields;
      if (
        key &&
        (key.includes('..') ||
          key.includes('./') ||
          key.includes('\\') ||
          key.includes('//'))
      ) {
        throw new CoolCommException('非法的key值');
      }
      if (_.isEmpty(ctx.files)) {
        throw new CoolCommException('上传文件为空');
      }
      const basePath = pUploadPath();

      const file = ctx.files[0];
      const extension = file.filename.split('.').pop();
      const name =
        moment().format('YYYYMMDD') + '/' + (key || `${uuid()}.${extension}`);
      const target = path.join(basePath, name);
      const dirPath = path.join(basePath, moment().format('YYYYMMDD'));
      if (!fs.existsSync(dirPath)) {
        fs.mkdirSync(dirPath);
      }
      const data = fs.readFileSync(file.data);
      fs.writeFileSync(target, data);
      // 主要变动在这里,key:上传图片的名称(带后缀),buffer:图片的buffer
      const cosResult = await uploadUtil.putObject({
        key: name,
        buffer: data,
      });
      return `https://${cosResult.Location}`;
      
    } catch (err) {
      console.error(err);
      throw new CoolCommException('上传失败' + err.message);
    }
  }


通过以上修改,原来的upload方法及前端组建调用上传方法会得到返回的腾讯云cos存储桶中图片的访问地址,add接口也会把该地址存储到数据库中。

此时admin-node/src/modules/plugin/config.tsdomain参数将会失效

// 基础插件配置
    hooks: {
      // 文件上传
      upload: {
        // 地址前缀
        domain: ``,
      },
    },

由于是非正式项目,存储桶访问权限设置的是公有读写,不需要做身份验证。如有需要可查看官方文档:设置存储桶访问权限


http://www.kler.cn/a/596858.html

相关文章:

  • Kafka--常见问题
  • 从边缘到核心:群联云防护如何重新定义安全加速边界?
  • 天闻数媒名师工作室系统 fileTempDownload 存在文件读取漏洞(DVB-2025-8998)
  • 网络华为HCIA+HCIP WLAN
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.3.22)
  • Node.js 包与 npm 详解:概念、作用及完整使用指南
  • 人工智能 - DeepSeek 和 Manus 的区别和应用场景
  • C++|GLog开源库的使用 如何实现自定义类型消息日志
  • 精益架构设计:深入理解与实践 C# 中的单一职责原则
  • QT网页显示的几种方法及对比
  • DeepSeek高校教程大合集(清华,北大,浙大,夏大,天大,湖大,天大,北师大),持续更新
  • 合成层优化
  • 2025新笔记:数字化转型建设的开源安全治理实践
  • 【贝叶斯定理(Bayesian Theorem)】
  • doris:FQDN
  • Flutter 快速接入Fair
  • Vagrant+VMWare 安装Ubuntu24.04
  • 烧结银技术赋能新能源汽车超级快充与高效驱动
  • C# 调用 VITS,推理模型 将文字转wav音频调试 -数字人分支
  • 电力和冷却管理:如何让数据中心“高效降温”同时节能增效