42

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

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

“除了在文件系统中提供图像的文件名,您还可以将缓冲区传递给 ExifImage。”

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

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

谢谢你的帮助!

4

7 回答 7

61

尝试像这样设置请求:

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

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

于 2013-08-16T02:55:32.853 回答
27

使用axios

const response = await axios.get(url,  { responseType: 'arraybuffer' })
const buffer = Buffer.from(response.data, "utf-8")
于 2020-03-03T11:34:46.830 回答
18

只有在阅读所需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 也无法正常工作。

这是使用节点 8 测试的

于 2018-06-28T08:47:14.627 回答
9

使用请求库。

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

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

更新了正确的回调签名。

于 2013-08-16T02:33:15.957 回答
7
import fetch from "node-fetch";

let fimg = await fetch(image.src)
let fimgb = Buffer.from(await fimg.arrayBuffer())
于 2021-01-28T21:01:59.827 回答
2

request已弃用,应尽可能避免使用。

好的替代品包括got(仅适用于 node.js)和axios(也支持浏览器)。

示例got

npm install got

使用 async/await 语法:

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);
    }
})();
于 2020-09-19T04:21:20.143 回答
2

你可以那样做

import axios from "axios";

function getFileContentById(
  download_url: string
): Promise < Buffer > {
  const response = await axios.get(download_url, {
    responseType: "arraybuffer",
  });
  return Buffer.from(response.data, "base64");
}
于 2021-08-15T22:18:52.460 回答