Skip to content

安装SDK

js
npm i @types/ali-oss ali-oss

创建oss模块

js
nest g module oss
nest g controller oss --no-spec
nest g service

代码实现

oss.module代码

把oss client封装成provide并且设置为global

js
import { Global, Module } from '@nestjs/common';
import * as OSS from 'ali-oss';
import { ConfigService } from '@nestjs/config';
import { OssController } from './oss.controller';
import { OssService } from './oss.service';

@Global()
@Module({
  controllers: [OssController],
  providers: [
    {
      provide: 'OSS_CLIENT',
      async useFactory(config: ConfigService) {
        const client = new OSS({
          region: config.get('OSS_REGION'),
          bucket: config.get('OSS_BUCKET'),
          accessKeyId: config.get('OSS_ACCESS_KEY_ID'),
          accessKeySecret: config.get('OSS_ACCESS_KEY_SECRECT'),
        });
        return client;
      },
      inject: [ConfigService],
    },
    OssService,
  ],
  exports: ['OSS_CLIENT'],
})
export class OssModule {}

oss.controller

图片限制也可以在FileInterceptor中做,我这里选择在oss.service处理

js
import {
  Controller,
  Inject,
  Post,
  UploadedFile,
  UseInterceptors,
} from '@nestjs/common';
import { OssService } from './oss.service';
import { FileInterceptor } from '@nestjs/platform-express';

@Controller('upload')
export class OssController {
  @Inject(OssService)
  private ossService: OssService;

  @Post('image')
  @UseInterceptors(FileInterceptor('file'))
  uploadImage(@UploadedFile() file: Express.Multer.File) {
    return this.ossService.uploadImage(file);
  }
}

oss.service

js
import {
  BadRequestException,
  HttpException,
  HttpStatus,
  Inject,
  Injectable,
} from '@nestjs/common';

@Injectable()
export class OssService {
  @Inject('OSS_CLIENT')
  private ossClient: any;

  async uploadImage(file: Express.Multer.File) {
    if (!file.mimetype.match(/\/(jpg|jpeg|png|gif)$/)) {
      throw new BadRequestException('只能上传图片');
    }
    // 检查文件大小 5MB
    if (file.size > 5 * 1024 * 1024) {
      throw new BadRequestException('文件大小不能超过5MB!');
    }
    try {
      const res = await this.ossClient.put(file.originalname, file.buffer);
      if (res) return res.url;
      throw new HttpException('上传失败', HttpStatus.BAD_REQUEST);
    } catch (error) {
      throw new HttpException(error, HttpStatus.BAD_REQUEST);
    }
  }
}