【问题标题】:nestjs multer get list of new file names after multer storagenestjs multer在multer存储后获取新文件名列表
【发布时间】:2019-10-06 01:29:57
【问题描述】:

我有这个用于上传文件的中间件。

@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 时,它给了我原始文件名而不是新文件名(带有日期等,就像我在 multer 存储选项中设置的那样)。

有没有办法让我用中间件获取刚刚上传的新文件名?

@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});
}

【问题讨论】:

  • 您可能希望在您的filename 函数中使用file.originalname 而不是file.fieldname。否则,您的所有文件都将以相同的前缀 files. 开头

标签: javascript node.js typescript multer nestjs


【解决方案1】:

首先:通过内置的FilesInterceptor 和 自定义FilesMiddleware 同时使用multer 是没有意义的。从以下两个选项中选择一个

A) 使用内置的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 来提供default multer storage configuration

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 } ]

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 1970-01-01
    • 2018-08-12
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2021-11-07
    • 2021-11-09
    相关资源
    最近更新 更多