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

Cod*_*eyB 24 javascript node.js express

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

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

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

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

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

谢谢你的帮助!

Dan*_*ohn 47

尝试设置这样的请求:

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

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

  • @TamusJRoyce这是一个更完整的例子:/sf/answers/1199310871/ (3认同)
  • 你提到它会“输出”一个缓冲区。你能描述一下输出在哪里吗?请求不返回值。 (2认同)

小智 32

import fetch from "node-fetch";

let fimg = await fetch(image.src)
let fimgb = Buffer.from(await fimg.arrayBuffer())
Run Code Online (Sandbox Code Playgroud)


Dep*_*ang 16

使用axios

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

  • 这应该是 2021 年公认的答案 (6认同)

Yeh*_*tan 11

I was able to solve this only after reading that encoding: null is required and providing it as an parameter to request.

This will download the image from url and produce a buffer with the image data.

Using the request library -

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'
});
Run Code Online (Sandbox Code Playgroud)

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

这已经在节点8上进行了测试

  • uri 丢失: request({ uri: url, encoding: null }, (err, resp, buffer) => { (2认同)

Viv*_*ajh 9

这是使用本机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);
Run Code Online (Sandbox Code Playgroud)

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

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


Tim*_*ple 8

使用请求库.

request('<s3imageurl>', function(err, response, buffer) {
    // Do something
});
Run Code Online (Sandbox Code Playgroud)

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

更新了正确的回调签名.


Min*_*wzy 5

you can do it that way

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");
}
Run Code Online (Sandbox Code Playgroud)