#node.js #mongodb #express #multer
Вопрос:
Что я пытаюсь сделать?: Итак, в основном я буду загружать zip-файл, и он будет сохранен в MongoDB, а затем пользователи смогут открыть магазин и загрузить эти файлы!
Шаги:
- Во-первых, я загружаю файл с помощью Multer в express.js!
const upload = multer({
storage: multer.memoryStorage()
}).fields([
{ name: 'fileupload'},
{ name: 'logo' },
{ name: 'screenshots' }
])
Поэтому я сохраняю файлы в памяти, а затем добавляю их в базу данных. Это включает в себя:- (а) массив изображений, (б) Один файл изображения (в) файл .zip (вот в чем проблема!)
- Хранение его в базе данных:-
return await mongo().then(async (mongoose) => {
try {
const result = await new pluginSchema({
name ,
desc ,
price ,
category ,
file ,
logo ,
images ,
reviews,
coupon
}).save()
pluginCache[result._id] = result // Caching the file (IMPORTANT)
return result
} finally {
mongoose.connection.close()
}
})
После добавления я сохраняю плагин (zip-файл) в переменную кэша. И я буду использовать эту переменную для получения «результата» вместо многократной выборки из базы данных!
Проблема: Хорошо, теперь , как только я попытаюсь перейти на страницу продукта и нажать «Загрузить», начнется загрузка файла. На этот раз плагин извлекается из переменной кэша, т. е. возвращается кэшированный результат, который загружается. Вот как я его загружаю,
res.set({
"Content-Type": plugin.file.mimetype,
"Content-Disposition": `attachment; filename=${plugin.file.originalname}`
})
res.send(plugin.file.buffer)
И файл загружается совершенно нормально, и ничего не повреждено!
но!
Когда я перезапускаю сервер, все переменные очищаются, а переменная кэша очищается, так что теперь плагин извлекается из базы данных. И как только он извлекается из базы данных и когда я загружаю этот файл, я получаю поврежденный zip-файл .
Важная Вещь: Консоль.регистрация файлов req. (multer хранит файлы здесь):-
{
fieldname: 'fileupload',
originalname: 'example.jar',
encoding: '7bit',
mimetype: 'application/x-zip-compressed',
buffer: <Buffer >, // CMD Doesn't display entire buffer data, but I have checked and this exists!
size: 0
}
И данные сохраняются в MongoDB таким образом,
[MongoDB][1]
И всякий раз, когда я извлекаю файлы непосредственно из MongoDB, файлы повреждаются, но когда я загружаю файлы, кэширую их и использую кэшированные переменные, все работает нормально! [1]: https://i.stack.imgur.com/PEPpt.png
Некоторые вещи, которые, по-моему, не имеют значения: загрузка поврежденного файла(извлечение и загрузка с MongoDB) приводит к увеличению размера файла до 14 КБ(вместо 11 КБ), и этот zip-файл не может быть распакован! Кроме того, изображения сохраняются в полном порядке, но почему файл .zip поврежден!
Комментарии:
1. Я нашел обходной путь для этого, создав папку, поместив в нее все файлы, а затем заархивировав папку и загрузив ее.