如何将图像从url加载到nodejs中的缓冲区中

时间:2013-08-16 01:17:21

标签: javascript node.js express

我是nodejs的新手,我正在尝试设置一个服务器,我从图像中获取exif信息。我的图像在S3上,所以我希望能够将s3 url作为参数传入并从中获取图像。

我使用下面的ExifImage项目获取exif信息并根据他们的文档:

“您可以将缓冲区传递给ExifImage,而不是在文件系统中提供图像文件名。”

如何将图像从网址加载到节点中的缓冲区,以便将其传递给ExifImage函数

ExifImage项目: https://github.com/gomfunkel/node-exif

感谢您的帮助!

6 个答案:

答案 0 :(得分:42)

尝试设置这样的请求:

var request = require('request').defaults({ encoding: null });
request.get(s3Url, function (err, res, body) {
      //process exif here
});

encoding设置为null将导致请求输出缓冲区而不是字符串。

答案 1 :(得分:7)

使用request库。

request('<s3imageurl>', function(err, response, buffer) {
    // Do something
});

此外,您可能会对node-image-headers感兴趣。听起来它需要一个流,所以它甚至不必从S3下载完整的图像来处理标题。

使用正确的回调签名进行了更新。

答案 2 :(得分:7)

只有在读取到encoding: null必需并将其作为请求参数提供后,我才能解决该问题。

这将从URL下载图像,并产生包含图像数据的缓冲区。

使用请求库-

const request = require('request');

let url = 'http://website.com/image.png';
request({ url, encoding: null }, (err, resp, buffer) => {
     // Use the buffer
     // buffer contains the image data
     // typeof buffer === 'object'
});

注意:省略encoding: null将导致字符串不可用,而不是缓冲区中。 Buffer.from也无法正常工作。

这已在Node 8上进行了测试

答案 3 :(得分:6)

使用axios

const response = await axios.get(url,  { responseType: 'arraybuffer' })
const buffer = Buffer.from(response.data, "utf-8")

答案 4 :(得分:1)

request已过时,应尽可能避免。

好的选择包括got(仅用于node.js)和axios(也支持浏览器)。

got的示例:

npm install got

使用异步/等待语法:

const got = require('got');

const url = 'https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png';

(async () => {
    try {
        const response = await got(url, { responseType: 'buffer' });
        const buffer = response.body;
    } catch (error) {
        console.log(error.body);
    }
})();

答案 5 :(得分:1)

const fetch = require("node-fetch");

const getBuffer = async (url) => {
  try {
    const response = await fetch(url);
    const arrayBuffer = await response.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);
    return buffer;
  } catch (error) {
    return { error };
  }
};