I'm trying to upload files with dynamic keys, but nest.js needs to know key names.
I tried this one:
@UseInterceptors(FilesInterceptor('files'))
async uploadFile(@Query() minioDto: MinioDto, @UploadedFiles() files: Array<BufferedFile>) {
const {bucket} = minioDto;
return (await this.minioClientService.upload(files, bucket))?.name;
}
I'm trying to upload files with dynamic keys, but nest.js needs to know key names.
I tried this one:
@UseInterceptors(FilesInterceptor('files'))
async uploadFile(@Query() minioDto: MinioDto, @UploadedFiles() files: Array<BufferedFile>) {
const {bucket} = minioDto;
return (await this.minioClientService.upload(files, bucket))?.name;
}
Here files are static, but I want dynamic like:
@UseInterceptors(FilesInterceptor())
async uploadFile(@Query() minioDto: MinioDto, @UploadedFiles() files: Array<BufferedFile>) {
const {bucket} = minioDto;
return (await this.minioClientService.upload(files, bucket))?.name;
}
I even tried to get files from the request but I couldn't
Share Improve this question edited May 16, 2022 at 8:00 Hossein Mousavi 3,8244 gold badges23 silver badges38 bronze badges asked Feb 20, 2022 at 21:09 Sahand ZeynolSahand Zeynol 3311 gold badge3 silver badges9 bronze badges3 Answers
Reset to default 13You can upload multiple files dynamically using AnyFilesInterceptor
provided by nest.js like below:
@Post('upload')
@UseInterceptors(AnyFilesInterceptor())
uploadFile(@UploadedFiles() files: Array<Express.Multer.File>) {
console.log(files);
}
You can upload multiple files with each field having a unique name using FileFieldsInterceptor like this -
@Post('upload')
@UseGuards(JwtAuthGuard)
@UseInterceptors(FileFieldsInterceptor([
{ name: 'profilePic', maxCount: 1 },
{ name: 'pitchDeck', maxCount: 10 },
]))
uploadFiles(@UploadedFiles() files: {profilePic: Express.Multer.File[], pitchDeck: Express.Multer.File[]}){
console.log('files', files);
}
This is how we can upload the files, I have written the code to upload single and multiple files using NEST.JS:
app.controller.ts:
import { Controller, Post, UploadedFiles, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express';
import { AppService } from './app.service';
import { Express } from 'express';
@Controller('api/portal/file')
export class AppController {
constructor(private appService: AppService) {}
@Post('/multiple')
@UseInterceptors(FilesInterceptor('files'))
async uploadFiles(@UploadedFiles() files: Array<Express.Multer.File>) {
// If you are getting the error "Namespace 'global.Express' has no exported member 'Multer'" then replace "Array<Express.Multer.File>" with "any" or try to remove error by installing Express/multer
const req = {
files,
prospectId: 1234,
};
return await this.appService.getUrls(req);
}
@Post('/single')
@UseInterceptors(FileInterceptor('file'))
async uploadFile(@UploadedFile() file: Express.Multer.File) {
const req = {
files: [file],
prospectId: 1234,
};
return await this.appService.getUrls(req);
}
}
app.service.ts:
import { Injectable } from '@nestjs/common';
import { FileDataReq, FileDataRes } from './dto/app.dto';
@Injectable()
export class AppService {
async getUrls(uploadData: FileDataReq): Promise<FileDataRes> {
const { prospectId } = uploadData;
const response = { urls: [], prospectId };
const { files } = uploadData;
for (const file of files) {
const { originalname } = file;
let url = `/${prospectId}/${new Date().getTime()}_${originalname.trim().split(' ').join('_')}`;
response.urls.push(url);
}
return response;
}
}
app.dto.ts:
export class FileDataReq {
files: Express.Multer.File[];
prospectId: number;
}
export class FileDataRes {
urls: string[];
prospectId: number;
}
Postman:
Multiple Upload:
SingleUpload: