如何使用Express

时间:2019-07-11 10:19:30

标签: javascript node.js image express http

我正在用NodeJS开发一种API。

我需要执行一种getImage,将与名称对应的图像返回到url中(例如:localhost:8080 / getImage / myImg)。

我在互联网上找到了许多教程,但是问题是我不能使用FS中的writeFile和readFile,因为我的图像与其他JSON信息一起存储在数组中。我存储的图像是由tomCat中的另一个API发送的,我的工作是通过设置NodeJS API来限制对tomCat API的调用。

我的问题是如何发送存储在变量/数组/ 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')
    }
  })
})

我要做的是:您以图片名称作为参数对url发出http请求,以“下载”图片并更改显示在我的主页上的元素的背景。

感谢您将来的回答。 祝你有美好的一天!

2 个答案:

答案 0 :(得分:1)

此代码将执行您希望的操作,假设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,因此请求网址如下所示:

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')
});

答案 1 :(得分:0)

我在tomCat API上执行请求的方式如下:

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请求的结果转换为缓冲区?