簡體   English   中英

如何將圖像從 url 加載到 nodejs 中的緩沖區

[英]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")

使用請求庫。

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,請隨時刪除這些類型。

我更喜歡這種方法,因為它不依賴於第 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM