[英]how to load an image from url into buffer in nodejs
我是 nodejs 的新手,正在嘗試設置一個服務器,從中獲取圖像的 exif 信息。 我的圖像在 S3 上,所以我希望能夠將 s3 url 作為參數傳遞並從中獲取圖像。
我正在使用下面的 ExifImage 項目來獲取 exif 信息並根據他們的文檔:
“除了在文件系統中提供圖像的文件名之外,您還可以將緩沖區傳遞給 ExifImage。”
如何將圖像從 url 加載到節點中的緩沖區,以便將其傳遞給 ExifImage function
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
將導致請求輸出緩沖區而不是字符串。
只有在閱讀該encoding: null
后,我才能解決這個問題encoding: null
需要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 測試的
使用axios :
const response = await axios.get(url, { responseType: 'arraybuffer' })
const buffer = Buffer.from(response.data, "utf-8")
這是一個使用本機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,請隨時刪除這些類型。
我更喜歡這種方法,因為它不依賴於第 3 方庫或已棄用的請求庫。
const fetch = require("node-fetch");
const getBuffer = async (url) => {
try {
const response = await fetch(url);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
return buffer;
} catch (error) {
return { error };
}
};
request
已被棄用,應盡可能避免。
好的替代方案包括got (僅適用於 node.js)和axios (也支持瀏覽器)。
got
例子:
npm install got
使用異步/等待語法:
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);
}
})();
你可以那樣做
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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.