Я сохранил файлы в базе данных Mongo, используя Mongo Grid fs. MongoDB предоставляет отличную спецификацию GridFS, которая позволяет хранить файлы размером более 16 МБ непосредственно в базе данных в файлах и фрагментах.
GridFS использует две коллекции для хранения файловых данных. Имена по умолчанию: fs.files
и fs.chunks
.
Первая коллекция содержит метаданные файла, включая имя, размер, тип содержимого и т. Д. Во второй коллекции происходит волшебство. Коллекция fs.chunks
содержит фактический файл, который был разбит на куски, размер по умолчанию 255 КБ.
Я получил файл, а затем куски. Нет проблем, когда я получаю только 1 файл, изображение завершено и не обрезано.
Но когда я кодирую код ниже, когда запрашиваю несколько файлов и кусков, а затем сохраняю его в locals.data.images_gallery
, некоторые изображения обрезаютсяа некоторые не отображаются.
Есть проблемы с моей реализацией? Поскольку я делал запросы к каждому файлу один за другим, у них нет проблем, но когда я запрашиваю несколько файлов, другие обрезаются, а некоторые не отображаются.
На самом деле я выполняю двоичный формат JSON. Таким образом, чтобы отобразить это как изображение, я должен сделать дополнительный шаг преобразования данных в строки в кодировке base64
Моя логика при получении файлов (несколько файлов изображений):
MongoClient.connect(url, function(err, client) {
if (err) {
return res.render('index', {
title: 'Uploaded Error',
message: 'MongoClient Connection error',
error: err.errMsg
});
}
const db = client.db(dbName);
const collection = db.collection('fs.files');
const collectionChunks = db.collection('fs.chunks');
collection.find({
metadata: locals.data.vehicle.VIN
}).toArray(function(err, docs) {
if (err) {
return res.render('index', {
title: 'File error',
message: 'Error finding file',
error: err.errMsg
});
}
if (!docs || docs.length === 0) {
return res.render('index', {
title: 'Download Error',
message: 'No file found'
});
} else {
for (let i = 0; i < docs.length; i++) {
docs_ids.push(docs[i]._id)
}
collectionChunks.find({
files_id: {
$in: docs_ids
}
})
.toArray(function(err, chunks) {
if (err) {
return res.render('index', {
title: 'Download Error',
message: 'Error retrieving chunks',
error: err.errmsg
});
}
if (!chunks || chunks.length === 0) {
return res.render('index', {
title: 'Download Error',
message: 'No data found'
});
}
for (let i = 0; i < chunks.length; i++) {
locals.data.images_gallery.push('data:' + docs[0].contentType + ';base64,' +
chunks[i].data.toString('base64'));
}
return next();
});
}