“Nestjs Multer” Ответ

Multer Nestjs

import 'dotenv/config.js'
import { MulterModule, FileFieldsInterceptor, FilesInterceptor, FileInterceptor } from '@nestjs/platform-express'
import { mimeTypeSupport } from '@helpers/helper.mimeType'
import aws from 'aws-sdk'
import { Request } from 'express'
import multer from 'multer'
import multerS3 from 'multer-s3'
import fs from 'fs'

aws.config.update({
	accessKeyId: process.env.AWS_ACCESS_KEY_ID,
	secretAccessKey: process.env.AWS_ACCESS_KEY
})

export class Multer {
	static typeModule = MulterModule
	static register = MulterModule.register
	static fields = FileFieldsInterceptor
	static array = FilesInterceptor
	static single = FileInterceptor

	static diskStorage: multer.StorageEngine = multer.diskStorage({
		destination(_: Request, file: Express.Multer.File, done: any) {
			let linux: string = `${process.env.IMG_DIR}`
			let window: string = process.env.TEMP || ''

			if (!file) {
				done(new Error('Uploading file failed'), null)
			} else {
				if (process.platform === 'win32') {
					if (fs.existsSync(window)) {
						done(null, window)
					} else {
						done(new Error('No such file directory').message, null)
					}
				} else {
					if (fs.existsSync(linux)) {
						done(null, linux)
					} else {
						done(new Error('No such file directory').message, null)
					}
				}
			}
		},
		filename(_req: Request, file: Express.Multer.File, done: any) {
			if (!file) done(new Error('Get file upload failed'), null)
			const fileName: string = `${Date.now().toString()} - ${file.originalname}`
			done(null, fileName)
		}
	})

	static awsStorage: multer.StorageEngine = multerS3({
		s3: new aws.S3(),
		bucket: process.env.AWS_BUCKET_NAME,
		contentType: multerS3.AUTO_CONTENT_TYPE,
		serverSideEncryption: 'AES256',
		metadata(_req: Request, file: Express.Multer.File, done: any) {
			if (!file) done(new Error('Get file upload failed'), null)
			done(null, file)
		},
		key(_req: Request, file: Express.Multer.File, done: any) {
			done(null, Date.now().toString())
		}
	})

	static fileFilter(_req: Request, file: Express.Multer.File, done: any) {
		if (!mimeTypeSupport(file.mimetype)) throw new TypeError('mimetype not supported')
		if (file.size >= 5242880) throw new TypeError('maximum file or image size must be 5 MB or under 5 MB')

		const fileName: string = `${Date.now().toString()} - ${file.originalname}`
		done(null, fileName)
	}
}
Restu Wahyu Saputra

Nestjs Multer

// use like this
	// @Role('customers')
	@UseGuards(JsonWebToken.JwtAuthentication)
	@Version('1')
	@Post(':action')
	@UseInterceptors(
		Multer.fields(
			[
				{ name: 'ktp_photo', maxCount: 1 },
				{ name: 'selfie_photo', maxCount: 1 }
			],
			{
				storage: Multer.diskStorage,
				fileFilter: Multer.fileFilter
			}
		)
	)
	async signatureHandlers(
		@Res() res: Response,
		@Req() req: Request,
		@Body() body: any,
		@UploadedFiles() files: { ktp_photo: Express.Multer.File[]; selfie_photo: Express.Multer.File[]; document?: Express.Multer.File[] }
	): Promise<OutgoingMessage> {
		try {
			const serviceResponse: APIResponse = await this.service.signatureHandlers(body, files)
			return res.status(serviceResponse.stat_code).json(serviceResponse)
		} catch (e: any) {
			return res.status(e.stat_code).json(e)
		}
	}
}


// custom libs multer
import 'dotenv/config.js'
import { MulterModule, FileFieldsInterceptor, FilesInterceptor, FileInterceptor } from '@nestjs/platform-express'
import { mimeTypeSupport } from '@helpers/helper.mimeType'
import aws from 'aws-sdk'
import { Request } from 'express'
import multer from 'multer'
import multerS3 from 'multer-s3'
import fs from 'fs'

aws.config.update({
	accessKeyId: process.env.AWS_ACCESS_KEY_ID,
	secretAccessKey: process.env.AWS_ACCESS_KEY
})

export class Multer {
	static typeModule = MulterModule
	static register = MulterModule.register
	static fields = FileFieldsInterceptor
	static array = FilesInterceptor
	static single = FileInterceptor

	static diskStorage: multer.StorageEngine = multer.diskStorage({
		destination(_: Request, file: Express.Multer.File, done: any) {
			let linux: string = `${process.env.IMG_DIR}`
			let window: string = process.env.TEMP || ''

			if (!file) {
				done(new Error('Uploading file failed'), null)
			} else {
				if (process.platform === 'win32') {
					if (fs.existsSync(window)) {
						done(null, window)
					} else {
						done(new Error('No such file directory').message, null)
					}
				} else {
					if (fs.existsSync(linux)) {
						done(null, linux)
					} else {
						done(new Error('No such file directory').message, null)
					}
				}
			}
		},
		filename(_req: Request, file: Express.Multer.File, done: any) {
			if (!file) done(new Error('Get file upload failed'), null)
			const fileName: string = `${Date.now().toString()} - ${file.originalname}`
			done(null, fileName)
		}
	})

	static awsStorage: multer.StorageEngine = multerS3({
		s3: new aws.S3(),
		bucket: process.env.AWS_BUCKET_NAME,
		contentType: multerS3.AUTO_CONTENT_TYPE,
		serverSideEncryption: 'AES256',
		key(_req: Request, file: Express.Multer.File, done: any) {
			const fileName: string = `${Date.now().toString()} - ${file.originalname}`
			done(null, fileName)
		}
	})

	static fileFilter(_req: Request, file: Express.Multer.File, done: any) {
		if (!mimeTypeSupport(file.mimetype)) throw new TypeError('mimetype not supported')
		if (file.size >= 5242880) throw new TypeError('maximum file or image size must be 5 MB or under 5 MB')

		const fileName: string = `${Date.now().toString()} - ${file.originalname}`
		done(null, fileName)
	}
}
Restu Wahyu Saputra

Ответы похожие на “Nestjs Multer”

Вопросы похожие на “Nestjs Multer”

Смотреть популярные ответы по языку

Смотреть другие языки программирования