NodeJS - multer - изменить имя файла в зависимости от атрибутов запроса - PullRequest
0 голосов
/ 26 ноября 2018

Я знаю, что могу изменить имя файла с помощью multer с помощью объекта хранения, например:

const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, process.env.UPLOAD_DIR);
    },
    filename: (req, file, cb) => {
        cb(null, 'bla.png');
    }
});
const upload = multer({ storage: storage } );

Мой запрос, помимо наличия файла, также содержит некоторые текстовые атрибуты, такие как name: myPic.png.

Возможно ли динамическое изменение имени файла в зависимости от других атрибутов запроса или в контроллере, например:

filename: (req, file, cb) => {
     cb(null, `${req.body.name}.png`);
}

или

router.post('/upload', upload.single('pic'), myController.upload);

/* in controller */
upload = async (req: Request, res: Response) => {
    try {

        /* change the filename of multer here? */

    } catch (err) {
        winston.error(`Error while uploading: ${err.message}`);
        winston.error(`Stack trace: ${err.stack}`);
        sendJSONResponse(res, err, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

1 Ответ

0 голосов
/ 27 ноября 2018

Multer - это промежуточное ПО, которое заполняет req.body и сохраняет файл.

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

Из того, что я вижу, у вас есть два варианта:

1) Переименовать загруженный файл после того, как промежуточное программное обеспечение загрузки мультитера выполнит свою работу и заполнит req.body, а также req.file.Таким образом, в промежуточном программном обеспечении для загрузки контроллера вы должны сделать что-то вроде:

if (req.file) {
    fs.renameSync(req.file.path, req.file.destination + req.body.name);
}

2) Измените текстовое поле основного текста запроса на параметр запроса.Затем внутри filename() вы можете сделать req.query.name.

Con: Не очень RESTful дизайн, но, возможно, это не так важно для вас.

...