NestJSIntermediate
NestJS File Upload (Multer)
FileInterceptor, single/multiple upload, validation, static serve — বাংলায়।
10টি অংশবাংলা ভাষায়
NestJS-এ file upload multer-ভিত্তিক FileInterceptor / FilesInterceptor decorator দিয়ে সহজে করা যায়।
Single File Upload
src/upload/upload.controller.tstypescript
typescript
import {
Controller,
Post,
UploadedFile,
UseInterceptors,
} from "@nestjs/common";
import { FileInterceptor } from "@nestjs/platform-express";
import { diskStorage } from "multer";
import { extname } from "node:path";
@Controller("upload")
export class UploadController {
@Post("avatar")
@UseInterceptors(
FileInterceptor("file", {
storage: diskStorage({
destination: "./uploads",
filename: (req, file, cb) => {
const unique = Date.now() + "-" + Math.round(Math.random() * 1e9);
cb(null, unique + extname(file.originalname));
},
}),
limits: { fileSize: 5 * 1024 * 1024 }, // 5MB
}),
)
uploadAvatar(
@UploadedFile() file: Express.Multer.File,
) {
return { message: "Upload সফল", file };
}
}Multiple Files
import { FilesInterceptor, FileFieldsInterceptor } from "@nestjs/platform-express";
@Post("gallery")
@UseInterceptors(
FilesInterceptor("files", 10), // ঘরে 10 files
)
uploadGallery(@UploadedFiles() files: Express.Multer.File[]) {
return { count: files.length };
}
@Post("profile")
@UseInterceptors(
FileFieldsInterceptor([
{ name: "avatar", maxCount: 1 },
{ name: "cover", maxCount: 1 },
]),
)
uploadProfile(@UploadedFiles() files: { avatar: File[]; cover: File[] }) {
return files;
}File Validation
import { BadRequestException } from "@nestjs/common";
const fileFilter = (req: any, file: any, cb: any) => {
const allowedTypes = ["image/jpeg", "image/png", "image/webp"];
if (!allowedTypes.includes(file.mimetype)) {
return cb(new BadRequestException("শুধু image allowed"), false);
}
cb(null, true);
};
// Multer options-এ
{
storage: diskStorage({ ... }),
fileFilter,
limits: { fileSize: 5 * 1024 * 1024 },
}Uploaded Files Serve
main.tstypescript
typescript
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { join } from "node:path";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// static serve
app.useStaticAssets(join(process.cwd(), "uploads"));
await app.listen(3000);
}
bootstrap();Production
Production-এ local disk-এ না — Cloudinary, S3, বা GCS bucket-এ upload করাই আদর্শ।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।