#javascript #node.js #multer
#javascript #node.js #мультер
Вопрос:
Я использую промежуточное ПО Multer в приложении Node / Express для отправки изображений во внешний интерфейс Vue. Я читал, что использование Date.now()
предотвратит коллизию имен файлов, но я разрабатываю это с целью добавления функциональности в более крупное приложение, поэтому я хочу знать, возможно ли, что при использовании Date.now()
приложение создает дублированные файлы с той же временной меткой. Мой код следующий:
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'public/img'); // Destination folder for uploaded pictures to serve them
},
filename: (req, file, cb) => {
const ext = file.mimetype.split('/')[1];
cb(null, `pic-${Date.now()}.${ext}`);
}
});
Мне интересно, есть ли возможность (и как ее достичь) получить два изображения с одинаковым именем, потому что метод, который я использую, позволяет загружать несколько файлов одновременно, и я не знаю, может ли функция Date.now() выполняться так быстро, чтоон генерирует один и тот же результат дважды. Я оставил функцию POST своего сервера просто для добавления большего контекста.
app.post('/uploadmultiple', upload.array('picture'), (req, res, next) => {
const imgArray = req.files;
if (!imgArray) {
const error = new Error('Please upload a valid image.');
error.httpStatusCode = 400;
return next(error);
}
res.status(201).json({ files: imgArray });
});
Если коллизия может произойти, я не знаю, что делать, потому что Multer переопределяет файлы с тем же именем, я не знаю, есть ли способ настроить имя файла, если система найдет другой с тем же именем, или есть другой способ полностью предотвратить коллизию имен файлов.
Комментарии:
1. Вы правы —
Date.now()
имеет разрешение в миллисекундах, но оно может выполняться несколько раз за 1 мс. Итак, чтобы предотвратить дублирование имени файла, вам необходимо использовать npmjs.com/package/tmp2. Или генератор, подобный npmjs.com/package/flake-idgen
3. Большое вам спасибо! модуль flake-idgen идеально подходит для моей проблемы!