#node.js #mongodb #express #multer
#node.js #mongodb #экспресс #мультер
Вопрос:
Ищу помощь по загрузке и извлечению изображений из MongoDB с помощью multer.
Мой интерфейс является реактивным.(Не уверен, нужно ли это, но просто для уверенности.)
Мультер
Проблема: после просмотра и выполнения руководств я могу закодировать свой путь к base64 и загрузить его в свою БД, но теперь я не понимаю, как извлечь файл из моей БД. Я видел несколько руководств по его декодированию из base64, но я не совсем понимаю, как мне получить изображение и отобразить его в postman. (Я пытался искать, но не нашел ничего, что дало бы мне ответ. Извините, если это дублированный вопрос. Если бы вы могли указать мне направление или дать мне несколько советов, я был бы очень признателен.)
**POST**
route.post("/sad", upload.single("image"), (req, res, next) => {
console.log(req.file);
const img = fs.readFileSync(req.file.path);
const img_enc = img.toString('base64');
const obj = {
usrImage: {
data: new Buffer.from(img_enc, 'base64'),
contentType: "image/jpg",
},
};
console.log(obj);
const newAccout = new account(obj);
newAccout.save();
});
**RETRIEVE**
route.get('/sad',(req,res)=>{
img.find({}).then((img)=>{
res.json(img)
//How do decode my buffer to show an image in Postman?
})
}
)
Я пытаюсь создать пользовательский профиль, в котором сохраняются имя пользователя, пароль и изображение. Если вы можете помочь сохранить изображение, а затем извлечь его из коллекции «Мои учетные записи».
Комментарии:
1. Просто дикое предположение: Я думаю, вам не следует оборачивать данные IMG объектом JSON, если вы хотите его отобразить. Вы должны передать некоторый заголовок типа контента (image / jpg) и изменить вкладку ответа на предварительный просмотр в postman.
2. Спасибо за ответ. Не могли бы вы подробнее рассказать о том, как мне передать заголовок типа контента?
3. nodejs.org/api/http.html#http_response_setheader_name_value Вот соответствующее место в документах. Заголовки типов контента используются для указания клиенту, как отображать данные.
Ответ №1:
Эй, я бы посоветовал вам начать использовать стороннюю программу для загрузки файлов, такую как cloudinary, очень хороший способ управления файлами, то есть изображениями или видео…
Я не очень хорошо разбираюсь в multer, но я могу привести краткий пример кода, используя Грозный, который выполняет ту же работу, что и multer
Прежде чем вы сможете начать, вам нужно будет создать учетную запись на cloudinary.com (не волнуйтесь, это бесплатно)
Приведенный ниже код показывает, как вы могли бы обрабатывать загрузку файлов
const Formidable = require("formidable"); //Meant for body parsing
const cloudinary = require("cloudinary").v2; // file uploader
//This below is your connection/configuration to get access to your cloudinary account so cloud_name, api_key and api_secret you'll get in your home dashboard(Cloudinary)
cloudinary.config({
cloud_name: process.env.CLOUD_NAME,
api_key: process.env.API_KEY,
api_secret: process.env.API_SECRET,
});
router.post('/api/file-upload', (req, res)=>{
const form = new Formidable.InconmingForm();
form.parse(req, (error, fields, files)=>{
const {file} = files
cloudinary.uploader.upload(file.path, {folder:"/"}, (err, res)=>{
const file_url = res.secure_url //This would be the url for your file given back by cloudinary
})
})
})
Этот скрипт должен загрузить ваш файл, и в file_url будет указан URL-адрес загружаемого вами файла с использованием ssl, после чего вы сможете продолжить сохранение в MongoDB
Cloudinary docs для NodeJS
https://cloudinary.com/documentation/node_integration
Хорошие четкие и понятные документы
Бесстыдный плагин
Если вы заблудились, вы можете посмотреть это видео на YouTube, которое я сделал для обработки загрузки файлов с помощью cloudinary, а затем сохранить URL-адрес, возвращенный в MongoDB
Комментарии:
1. Спасибо за ответ. Извините, но это не то, что я хочу, но я смотрел ваши видео, я добавлю, если мне когда-нибудь понадобится использовать cloudinary.
Ответ №2:
Первый вызов api находит один
вам понадобится модуль fs для выполнения следующего запроса
const fs = require('fs');
let data = await db.user.findOne({
where: {
id = req.body.id
}
})
// _________________ base 64 string data from findone query data
// |
let buff = new Buffer(data.image, 'base64');
let name = name.jpeg
let path = `tmp/${name}`; // <--- destination and file name you want to give to your file
fs.writeFileSync(path, buff);// < --this will write file to given path
fs.readFile(path, function (err, content) {// <------to send file in postman response
if (err) {
res.writeHead(400)
console.log(err);
res.end("No such image");
} else {
//specify the content type in the response will be an image
res.writeHead(200);
res.end(content);
}
});
fs.unlink(path, (err) => { // <-----to delete file from tmp directory
if (err) {
console.log(err)
}
})
Ответ №3:
Попробуйте это и переключитесь на вкладку предварительного просмотра в postman. Я не пробовал, но, возможно, это поможет.
route.get('/sad',(req,res)=>{
img.find({}).then((img)=>{
res.setHeader('contentType','image/jpg').send(img)
})
})
Комментарии:
1. Я пробовал этот способ, и я только извлекаю данные на вкладке предварительного просмотра. Он не отвечает изображением.
2. Возможно, отправить
img.data
. Я действительно предполагаю здесь. Что вы подразумеваете под «извлечением данных»?3. Когда я использую ваш фрагмент кода для получения файла изображения из моей коллекции БД, он отвечает: ` {«usrImage»:{«data»:{«type»:»Buffer»,»data»:[255,216,255,224,0,16,74,70,73,70, …. ` Он также показывает указанные данные на вкладке предварительного просмотра вместо изображения.
4. Я думаю, вам нужно прочитать буфер, как вы делали в своей функции post. Я не делал ничего подобного, поэтому, возможно, посмотрите, как использовать Buffer. из и загрузите данные из своей базы данных так, как вы их там сохранили.
5. Извините, кажется, я все еще потерян. Знаете ли вы какие-нибудь хорошие руководства по загрузке изображений в MongoDB и извлечению указанного изображения?