Nest 学习笔记:文件上传
关键概念
Multer:一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,主要用于上传文件。
腾讯云 COS:登录后获取 SecretId
,SecretKey
,Bucket
,area
,再利用 COS SDK 完成上传操作。
实现流程
import {
Controller,
Post,
UseInterceptors,
UploadedFile,
HttpException,
HttpStatus,
} from "@nestjs/common";
import { FileInterceptor } from "@nestjs/platform-express";
import * as COS from "cos-nodejs-sdk-v5";
@Controller("avatar")
export class AvatarController {
private cos;
constructor() {
// 1. 初始化 COS 实例
this.cos = new COS({
SecretId: SECRET_ID,
SecretKey: SECRET_KEY,
});
}
@Post("upload")
// 使用 `FileInterceptor` 中间件拦截上传的文件,文件的接收字段命名为 `file`。
@UseInterceptors(FileInterceptor("file"))
async uploadAvatar(@UploadedFile() file: Express.Multer.File) {
if (!file)
throw new HttpException("No file provided", HttpStatus.BAD_REQUEST);
const Bucket = BUCKET; // Bucket名称,格式为:test-1250000000
const Region = REGION; // Bucket所在区域
const Key = `avatars/${Date.now()}-${file.originalname}`; // 上传到COS的对象键
console.log(file.buffer);
// 使用Promise封装上传逻辑
const uploadPromise = new Promise((resolve, reject) => {
// putObject 方法将文件上传到 COS,
this.cos.putObject(
{
Bucket,
Region,
Key,
Body: file.buffer, // 文件内容通过 file.buffer 提供给 COS SDK
},
(err, data) => {
if (err) reject(err);
else resolve(data);
}
);
});
try {
const result = await uploadPromise;
// 上传成功后,构造并返回文件在COS上的访问URL。
return { url: `https://${Bucket}.cos.${Region}.myqcloud.com/${Key}` };
} catch (error) {
throw new HttpException(
"Failed to upload image to COS",
HttpStatus.INTERNAL_SERVER_ERROR
);
}
}
}