javascript - nestjs multer obtener lista de nuevos nombres de archivos después del almacenamiento de multer
Tengo este middleware que uso para subir archivos.
@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();
}
}
}
El problema es que en mi solicitud, cuando uso req.files me da los nombres de archivo originales en lugar de los nuevos nombres de archivo (con fecha, etc., como lo configuré en las opciones de almacenamiento de multer).
¿Hay alguna manera de obtener los nuevos nombres de archivo que multer acaba de subir con el middleware?
@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});
}
Respuesta #1
Primero que nada: No tiene sentido usar tanto multer a través del FilesInterceptor incorporado y un FilesMiddleware personalizado. Elija una de las siguientes dos opciones:
A) Use el FilesInterceptor incorporado (recomendado)
Puede proporcionar su configuración de almacenamiento directamente para cada 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);
}
}
O proporciona la configuración de almacenamiento predeterminada de multer importando el MulterModule:
imports: [
MulterModule.register({
storage: {...},
})
]
B) Usando tu propio middleware (sin FilesInterceptor)
Usa esto solo si necesitas más flexibilidad de la que proporciona el FilesInterceptor. Puedes usar un Promise para esperar a que la carga termine. Después de la carga, puedes acceder a los nuevos nombres de archivo a través de 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();
}
}
Accede a los archivos subidos en tu controlador a través del objeto request:
@Post('upload')
public async onUpload(@Request() req) {
return req.files.map(file => file.filename);
}
¿Cómo acceder a los nuevos nombres de archivo?
Encontrarás los archivos subidos en req.files (middleware) o @UploadedFiles() files (interceptor) como un arreglo con la siguiente estructura:
[ { 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 } ]
