Nodejs fs.readfile图片二进制结果=远程图片得到相同结果

Nodejs fs.readfile图片二进制结果=远程图片得到相同结果

大家都知道 fs.readFile可以读取远程图片获的二进制结果
现在有个需求 想获取远程图片 该怎么办 我不想把图片下载到本地 然后再用fs.readFile去读 增大了开销 有木有办法

4 回复

当然可以!你可以直接从远程服务器获取图片的二进制数据,而不需要先将其下载到本地。这里我们可以使用 httphttps 模块来实现这一点。

示例代码

const https = require('https'); // 如果是HTTP请求,可以使用 http 模块

// 远程图片URL
const imageUrl = 'https://example.com/path/to/image.jpg';

// 创建一个HTTPS请求
https.get(imageUrl, (response) => {
    let imageData = '';

    // 监听 data 事件,每次接收到数据时触发
    response.on('data', (chunk) => {
        imageData += chunk;
    });

    // 监听 end 事件,当数据接收完毕时触发
    response.on('end', () => {
        console.log('图片已完全加载');
        
        // 将二进制数据转换为 Buffer 对象
        const imageBuffer = Buffer.from(imageData);
        
        // 输出二进制数据的长度
        console.log(`图片大小: ${imageBuffer.length} 字节`);
        
        // 可以在这里处理 imageBuffer,例如保存到文件或进行其他操作
    });
}).on('error', (error) => {
    console.error(`请求错误: ${error.message}`);
});

解释

  1. 引入模块

    • 使用 https 模块(如果 URL 是 HTTPS),或者 http 模块(如果 URL 是 HTTP)。
  2. 创建请求

    • 使用 https.get 方法发起一个 GET 请求到指定的远程图片 URL。
  3. 监听数据事件

    • data 事件中,将接收到的数据片段拼接到 imageData 中。
  4. 监听结束事件

    • 当所有数据都接收完毕后,在 end 事件中处理最终的二进制数据。
  5. 处理二进制数据

    • 将接收到的数据片段拼接成完整的 Buffer 对象。
    • 可以输出二进制数据的长度,或者进一步处理该二进制数据,如保存到文件、上传到其他服务器等。

这样,你就可以直接获取远程图片的二进制数据,而无需将其下载到本地再读取,从而减少不必要的开销。


var http = require('http');

/**
 * 读取远程文件
 *
 * [@param](/user/param) {String} url
 * [@param](/user/param) {Function} cb
 * - {Error} err
 * - {Buffer} buf
 */
function readRemoteFile (url, cb) {
  var callback = function () {
    // 回调函数,避免重复调用
    callback = function () {};
    cb.apply(null, arguments);
  };

  var req = http.get(url, function (res) {
    var b = [];
    res.on('data', function (c) {
      b.push(c);
    });
    res.on('end', function () {
      callback(null, Buffer.concat(b));
    });
    res.on('error', callback);
  });
  req.on('error', callback);
}

readRemoteFile('http://www.baidu.com/img/bdlogo.gif', function (err, buffer) {
  if (err) throw err;
  console.log(buffer.length, buffer);
});

输出2进制不可以么,就像验证码一样

为了实现从远程服务器获取图片并直接获得其二进制数据,你可以使用Node.js中的httphttps模块来发起HTTP请求。下面是一个简单的示例代码,展示了如何通过HTTP请求获取远程图片,并将其以二进制形式返回。

示例代码

const https = require('https');

function fetchImage(url) {
    return new Promise((resolve, reject) => {
        https.get(url, (response) => {
            if (response.statusCode !== 200) {
                reject(new Error(`Failed to fetch image: ${response.statusCode}`));
                return;
            }

            const chunks = [];
            response.on('data', (chunk) => {
                chunks.push(chunk);
            });

            response.on('end', () => {
                const binaryData = Buffer.concat(chunks);
                resolve(binaryData);
            });
        }).on('error', (err) => {
            reject(err);
        });
    });
}

// 使用示例
fetchImage('https://example.com/path/to/image.jpg')
    .then((binaryData) => {
        console.log('Image fetched successfully:', binaryData.length, 'bytes');
        // 在这里处理二进制数据,例如保存到文件或进行其他操作
    })
    .catch((err) => {
        console.error('Error fetching image:', err);
    });

解释

  1. 引入模块

    • 使用https模块来发起HTTPS请求(如果需要HTTP请求,可以用http模块替换)。
  2. 定义函数

    • fetchImage(url) 函数接受一个URL作为参数,并返回一个Promise。
  3. 发起请求

    • https.get(url, callback) 发起GET请求到指定的URL。
    • 如果响应状态码不是200,则抛出错误。
  4. 接收数据

    • 将接收到的数据分块存储在数组中。
    • 当所有数据都接收完毕后,使用Buffer.concat将所有块连接成一个完整的Buffer对象。
  5. 处理结果

    • 将二进制数据返回给调用者。
    • 在实际应用中,你可以进一步处理这些数据,例如保存到文件或进行其他处理。

这样,你就可以直接从远程服务器获取图片的二进制数据,而不需要先下载到本地再读取,从而减少了不必要的开销。

回到顶部