nestjs multer получает список новых имен файлов после хранения multer - PullRequest
7 голосов
/ 19 мая 2019

У меня есть это промежуточное ПО, которое я использую для загрузки файлов.

@Injectable()
export class FilesMiddleware implements NestMiddleware {

  private storage = multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, path.join(__dirname, '../../uploads/'));
    },
    filename: (req, file, cb) => {
      let extArray = file.mimetype.split("/");
      let extension = extArray[extArray.length - 1];
      cb(null, file.fieldname + '-' + Date.now() + '.' + extension)
    }
});

  resolve(...args: any[]): MiddlewareFunction {
    return (req, res, next) => {
      console.log(req.files);
      const upload = multer({storage: this.storage});
      upload.any();
      return next();
    }
  }
}

Проблема в том, что в моем запросе, когда я использую req.files, он дает мне исходные имена файлов вместо новых имен файлов (с датой и т. Д., Которые я установил в опциях хранения мультиптера).

Есть ли способ, как я могу получить новые имена файлов, которые загружаются с помощью промежуточного программного обеспечения?

@Post('upload')
@UseInterceptors(FilesInterceptor('files[]', 20, {}))
public async onUpload(@Request() req, @Response() res, @UploadedFiles() files) {
    const mediaResponse = await this.media.saveMedias(0, files);
    res.json({status: true});
}

1 Ответ

3 голосов
/ 21 мая 2019

Прежде всего: не имеет смысла использовать multer через встроенные FilesInterceptor и пользовательские FilesMiddleware. Выберите один из следующих двух параметров:

А) Используйте встроенный FilesInterceptor (рекомендуется)

Вы можете указать конфигурацию хранилища для каждого FilesInterceptor:

const storage = {...};

@Controller()
export class AppController {

  @Post('upload')
  @UseInterceptors(FilesInterceptor('files', 20, { storage }))
  public async onUpload(@UploadedFiles() files) {
    return files.map(file => file.filename);
  }
}

Или укажите стандартную конфигурацию хранилища мультиптера , импортировав MulterModule:

imports: [
  MulterModule.register({
    storage: {...},
  })
]

B) Использование собственного промежуточного программного обеспечения (без FilesInterceptor)

Используйте это только если вам нужно больше гибкости, чем обеспечивает FilesInterceptor. Вы можете использовать Promise, чтобы дождаться окончания загрузки. После загрузки вы можете получить доступ к новым именам файлов через req.files.

export class FilesMiddleware implements NestMiddleware {
  private storage = {...};

  async use(req, res, next) {
    const upload = multer({ storage: this.storage });
    // wait until upload has finished
    await new Promise((resolve, reject) => {
      upload.array('files')(req, res, err => err ? reject(err) : resolve());
    });
    // Then you can access the new file names
    console.log(req.files.map(file => file.filename));
    return next();
  }
}

Доступ к загруженным файлам вашего контроллера через объект request:

@Post('upload')
public async onUpload(@Request() req) {
  return req.files.map(file => file.filename);
}

Как получить доступ к новым именам файлов?

Вы найдете загруженные файлы в req.files (промежуточное программное обеспечение) или @UploadedFiles() files (перехватчик) в виде массива со следующей структурой:

[ { fieldname: 'files',
    originalname: 'originalname.json',
    encoding: '7bit',
    mimetype: 'application/json',
    destination: 'D:/myproject/src/uploads',
    // This is what you are looking for
    filename: 'files-1558459911159.json',
    path:
     'D:/myproject/src/uploads/files-1558459911159.json',
    size: 2735 } ]
...