Nest 学习笔记:文件上传

Nest
笔记
Node

关键概念

Multer:一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,主要用于上传文件。

腾讯云 COS:登录后获取 SecretIdSecretKeyBucketarea,再利用 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
			);
		}
	}
}