javascript 如何从url加载图像到nodejs缓冲区

ruoxqz4g  于 2023-03-06  发布在  Java
关注(0)|答案(9)|浏览(161)

我是nodejs的新手,我正在尝试建立一个服务器,在那里我可以从一个图像中获取exif信息,我的图像在S3上,所以我希望能够将s3 url作为一个参数传入,并从它那里获取图像。
我正在使用下面的ExifImage项目来获取exif信息,并根据他们的文档:
“除了在文件系统中提供映像的文件名之外,您还可以向ExifImage传递缓冲区。”
如何将图像从url加载到节点中的缓冲区,以便将其传递给ExifImage函数
ExifImage项目:https://github.com/gomfunkel/node-exif
谢谢你的帮忙!

flvtvl50

flvtvl501#

请尝试按如下方式设置请求:

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

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

chhkpiq4

chhkpiq42#

使用axios

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

myzjeezk3#

import fetch from "node-fetch";

let fimg = await fetch(image.src)
let fimgb = Buffer.from(await fimg.arrayBuffer())
plupiseo

plupiseo4#

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

l3zydbqr

l3zydbqr5#

使用request库。

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

另外,您可能会对node-image-headers感兴趣,它听起来像是需要一个流,所以它甚至不需要从S3下载完整的映像来处理头部。

  • 使用正确的回调签名更新。*
fv2wmkja

fv2wmkja6#

下面是一个使用原生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,请随意删除这些类型。
我更喜欢这种方法,因为它不依赖于第三方库或过时的请求库。

v2g6jxz6

v2g6jxz67#

request已过时,应尽可能避免使用。
好的替代方案包括got(仅适用于node.js)和axios(也支持浏览器)。
got的示例:

npm install got

使用异步/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);
    }
})();
4smxwvx5

4smxwvx58#

你可以那样做

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

blmhpbnm9#

完成此操作的最简单2行代码

node.js中有一个名为node-fetch的内置模块。你可以使用它从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();

相关问题