最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Upload dynamic multiple files in Nest JS - Stack Overflow

programmeradmin3浏览0评论

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 badges
Add a comment  | 

3 Answers 3

Reset to default 13

You 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:

发布评论

评论列表(0)

  1. 暂无评论