Appearance
安装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);
}
}
}