如何将图片从url加载到nodejs中的缓冲区中
how to load an image from url into buffer in nodejs
我是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();
- NodeJS,通过socket控制台发送缓冲区后表示'这不是缓冲区
- 在 nodejs 中用双引号切片缓冲区时获取额外的字符
- NodeJs - 如何将数据块转换为新的缓冲区
- 在 NodeJS 中复制缓冲区时出现问题
- nodejs 请求 - toString 失败 - 大文件的缓冲区大小问题 (maxBufferSize)
- 将 C 格式传递给 nodejs 缓冲区
- 有没有一种成功的方法来销毁缓冲区实例并释放 NodeJS 画布中使用的内存
- 创建导致 nodejs 应用程序崩溃的缓冲区
- 缓冲区中的nodejs解码字符串返回多行字符串
- 如何将图片从url加载到nodejs中的缓冲区中
- dojo/使用NodeJS请求一个png图像数组缓冲区,并将图像返回给客户端
- 比较NodeJS缓冲区,同时避免定时攻击
- 转换nodejs'浏览器缓冲区'javascript
- 如何创建一个RxJS缓冲区,将NodeJS中的元素分组,但不依赖于永远运行的间隔
- 将二进制数据从Nodejs缓冲区写入到流星客户端的blob
- nodejs中的缓冲区大小
- Nodejs:将字符串转换为缓冲区
- NodeJS提取数组缓冲区的视频作为图像
- javascript从缓冲区(nodejs/socket.io)将图像绘制到html中
- 缓冲区+writeUInt32LE从NodeJS到Javascript