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

how to load an image from url into buffer in nodejs

本文关键字:nodejs 缓冲区 加载 url      更新时间:2023-09-26

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

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

"您也可以将Buffer传递给ExifImage,而不是在文件系统中提供映像的文件名。"

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

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

谢谢你的帮助!

尝试设置这样的请求:

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

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

使用axios:

const response = await axios.get(url,  { responseType: 'arraybuffer' })
const buffer = Buffer.from(response.data, "utf-8")
import fetch from "node-fetch";
let fimg = await fetch(image.src)
let fimgb = Buffer.from(await fimg.arrayBuffer())

只有在阅读了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 测试的

使用请求库。

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

此外,您可能对节点图像标头感兴趣。听起来它需要一个流,所以它甚至不需要从S3下载完整的图像来处理头部。

更新为正确的回调签名

这里有一个使用本机https库的解决方案。

import { get } from "https";
function urlToBuffer(url: string): Promise<Buffer> {
  return new Promise((resolve, reject) => {
    const data: Uint8Array[] = [];
    get(url, (res) => {
      res
        .on("data", (chunk: Uint8Array) => {
          data.push(chunk);
        })
        .on("end", () => {
          resolve(Buffer.concat(data));
        })
        .on("error", (err) => {
          reject(err);
        });
    });
  });
}
const imageUrl = "https://i.imgur.com/8k7e1Hm.png";
const imageBuffer = await urlToBuffer(imageUrl);

如果您正在寻找javascript,请随意删除这些类型。

我更喜欢这种方法,因为它不依赖于第三方库或不推荐使用的请求库。

你可以用的方式

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

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

好的替代方案包括get(仅适用于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);
    }
})();

最简单的2行代码

node.js中,有一个名为nodefetch的内置模块。您可以使用它从url下载图像,并用作缓冲区,然后您可以将该缓冲区保存在任何文件系统中,如s3 bucketazure等。

import fetch from "node-fetch"
const image_url = "https://my-image-url.com";
const res = await fetch(image_url);
const resBuffer = await res.buffer();