nestjs multer 获取 multer 存储后的新文件名列表
nestjs multer get list of new file names after multer storage
我有这个用于上传文件的中间件。
@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});
}
首先:通过 built-in FilesInterceptor
和 自定义 FilesMiddleware
同时使用 multer 是没有意义的。选择以下两个选项中的一个:
A) 使用built-in 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 } ]
我有这个用于上传文件的中间件。
@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});
}
首先:通过 built-in FilesInterceptor
和 自定义 FilesMiddleware
同时使用 multer 是没有意义的。选择以下两个选项中的一个:
A) 使用built-in 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 } ]