nodejs: извлечение изображений base64 из Mongodb с помощью Postman

#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

https://youtu.be/mlu-tbr2uUk

Комментарии:

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 и извлечению указанного изображения?