Как отправить изображение по HTTP с помощью Express - PullRequest
0 голосов
/ 11 июля 2019

Я разрабатываю своего рода API с NodeJS.

Мне нужно сделать вид getImage, который возвращает изображение, соответствующее имени в URL (например: localhost: 8080 / getImage / myImg).

Я нашел много учебных пособий в Интернете, но проблема в том, что я не должен использовать writeFile и readFile из FS, потому что мои изображения хранятся в массиве с другой информацией JSON. Изображения, которые я храню, отправляются другим API в tomCat, и моя задача состоит в том, чтобы ограничить вызовы API tomCat путем настройки API NodeJS.

У меня вопрос, как отправить изображение, хранящееся в переменной / array / json?

Я попробовал приведенный ниже код, но когда я перехожу на localhost: 8080 / getImage / myImg, код выполняется, но ничего не возвращается. Я не пытался использовать какую-то папку tmp, где я сортирую изображения, потому что я работаю над большим продуктом, и если я могу ограничить доступ к диску, это было бы здорово.

app.get('/getImage/:name', (req, res) => {
  imagesArray.forEach( (image) => {
    if(req.params.name === image.small_image_name) {
      res.writeHead(200, {'content-type': 'image/jpeg'})
      res.end(image.small_image, 'binary')
    } else if (req.params.name === image.full_image_name) {
      res.writeHead(200, {'content-type': 'image/jpeg'})
      res.end(image.full_image, 'binary')
    }
  })
})

Я хотел бы сделать следующее: вы делаете http-запрос к URL с именем изображения в качестве параметра, чтобы «загрузить» изображение и изменить фон элемента, отображаемого на моей главной странице.

Спасибо за ваши будущие ответы. хорошего дня!

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Этот код будет делать то, что вы хотите, я предполагаю, что image.small_image и image.full_image содержат объекты Buffer с данными изображения.Если данные изображения хранятся в виде байтового массива или строки base64, это легко преобразовать в буфер.

app.get('/getImage/:name', (req, res) => {
    const image = imagesArray.find(image => (req.params.name === image.small_image_name || req.params.name === image.full_image_name));

    if (!image) {
        res.status(404).send("Image not found");
        return;
    }

    const imageBuffer = (req.params.name === image.small_image_name) ? image.small_image: image.full_image;
    res.writeHead(200, { 'content-type': 'image/jpeg' })
    res.end(imageBuffer, 'binary')
});

Я использую порт 3000 на моей локальной машине, поэтому URL запроса будет выглядетьнапример:

http://localhost:3000/getImage/test.jpg

Другой подход заключается в том, чтобы заранее создать карту ваших изображений, это повысит эффективность поиска.Имейте в виду, что это может увеличить требования к памяти процесса.

const imageMap = imagesArray.reduce((map, image) => { 
    map[image.small_image_name] = { name: image.small_image_name, data: image.small_image };
    map[image.full_image_name] = { name: image.full_image_name, data: image.full_image };
    return map;
}, {});

app.get('/getImage/:name', (req, res) => {
    const image = imageMap[req.params.name];
    if (!image) {
        res.status(404).send("Image not found");
        return;
    }

    res.writeHead(200, { 'content-type': 'image/jpeg' })
    res.end(image.data, 'binary')
});
0 голосов
/ 11 июля 2019

способ выполнения запроса к API tomCat следующий

http.get('http://10.10.0.8:8080/CWallWeb/ajax/getImage.jsp?f=' + body.data[i].urlPreviewPath + '&d=' + date, res => {
        let body = ''

        res.on('data', data => {
          body += data
        })

        res.on('end', () => {
          small_image = body
        })
      })

Это явно не буфер, это строка, как я могу преобразовать результат http-запроса в буфер?

...