1. 준비물
2. 과정
1) 기능 module에 multerModule Import + 옵션 추가
cats.module.ts
@Module({
imports: [
MongooseModule.forFeature([{ name: Cat.name, schema: CatSchema }]),
forwardRef(() => AuthModule),
MulterModule.register({
dest: './upload',
}),
],
2) 이미지 관련 API에 FileInterceptor 등록. 이 때, multer가 옵션으로 활요됨
cats.controller.ts
@ApiOperation({ summary: '이미지 업로드' })
@UseInterceptors(FilesInterceptor('image', 10, multerOptions('cats')))
@UseGuards(jwtGuard)
@Post('upload')
uploadCatImg(@UploadedFiles() files: Array<Express.Multer.File>, @User() cat: Cat) {
console.log(files);
return this.catsService.uploadImg(cat, files);
}
3) multerOptions 설정
- common 폴더의 utiles라는 폴더 안에 설정하는 것이 가독성이 좋다.
- 파일 구성을 요약하자면, 클라이언트에게서 받은 파일을 저장할 폴더의 이름과 위치, 파일의 이름을 일괄적으로 정하는 option을 생성하는 것이다.
- multerOption은 커스텀이 가능하고, 아래 url을 참고하면 된다.
https://github.com/expressjs/multer
import * as multer from 'multer';
import * as path from 'path';
import * as fs from 'fs';
import { MulterOptions } from '@nestjs/platform-express/multer/interfaces/multer-options.interface';
const createFolder = (folder: string) => {
try {
console.log('💾 Create a root uploads folder...');
fs.mkdirSync(path.join(__dirname, '..', `uploads`));
} catch (error) {
console.log('The folder already exists...');
}
try {
console.log(`💾 Create a ${folder} uploads folder...`);
fs.mkdirSync(path.join(__dirname, '..', `uploads/${folder}`));
} catch (error) {
console.log(`The ${folder} folder already exists...`);
}
};
const storage = (folder: string): multer.StorageEngine => {
createFolder(folder);
return multer.diskStorage({
destination(req, file, cb) {
const folderName = path.join(__dirname, '..', `uploads/${folder}`);
cb(null, folderName);
},
filename(req, file, cb) {
const ext = path.extname(file.originalname);
const fileName = `${path.basename(
file.originalname,
ext,
)} + ${Date.now()}${ext}`;
cb(null, fileName);
},
});
};
export const multerOptions = (folder: string) => {
const result: MulterOptions = {
storage: storage(folder),
};
return result;
};
4) main.ts에서 정적파일 관리를 위한 미들웨어 설정(서버 내부에서 이미지 관리하는 경우)
app.useStaticAssets(path.join(__dirname, './common', 'uploads'), { prefix: '/media' });
- bootstrap에 이를 저장할 경우, path.join에 기록된 서버 내부의 uri를 prefix에 할당된 값으로 치환함.
참고자료