Javascript 如何从节点获取调用中获取原始文件数据?

Javascript 如何从节点获取调用中获取原始文件数据?,javascript,node.js,node-fetch,Javascript,Node.js,Node Fetch,假设我有一个端点,比如https://someurl.com/myfile.mp4。我想获取mp4文件并将其原始数据插入字符串中,以便计算整个文件内容的sha256。如何使用节点获取库执行此操作?我在internet上找到的所有示例都假设从查询返回json对象,是否总是这样,我应该使用另一个库?下面是一个示例代码: let urlFinal = 'https://someurl.com/myfile.mp4'; let videoFile = await fetch(urlFinal, {met

假设我有一个端点,比如
https://someurl.com/myfile.mp4
。我想获取mp4文件并将其原始数据插入字符串中,以便计算整个文件内容的sha256。如何使用节点获取库执行此操作?我在internet上找到的所有示例都假设从查询返回json对象,是否总是这样,我应该使用另一个库?下面是一个示例代码:

let urlFinal = 'https://someurl.com/myfile.mp4';
let videoFile = await fetch(urlFinal, {method: 'GET'}).then(res => { return res.blob() });
console.log('videofile: ' + videoFile) // prints out: videofile: [object Blob]
console.log('videofile: ' + JSON.stringify(videoFile)) // prints out: videofile: {}
calculateHash(videoFile)

我也没有在中找到关于
blob()
函数和对象的任何信息。那么,在这种情况下,获取文件数据的最简单方法是什么?提前感谢

在内存中下载视频原始内容,如下所示:

const downloadNew = () => {
    http.get(urlFinal, (res) => {
        const { statusCode } = res;
        const contentType = res.headers['content-type'];

        let error;
        if (statusCode !== 200) {
            error = new Error('Request Failed.\n' +
                `Status Code: ${statusCode}`);
        } 
        
        if (error) {
            console.error(error.message);
            res.resume();
            return;
        }

        res.setEncoding('utf8');
        let rawData = '';
        res.on('data', (chunk) => { rawData += chunk; });
        res.on('end', () => {
            try {
                console.log(rawData);
            } catch (e) {
                console.error(e.message);
            }
        });
    }).on('error', (e) => {
        console.error(`Got error: ${e.message}`);
    });
}
const http = require('http');
const fs = require('fs');
const urlFinal = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4';
const util = require("util");
const fetch = require("node-fetch");
const newFilePath = "/home/amulyakashyap/Desktop/download/BigBuckBunny.mp4";

const downloadUsingFetch => ()=>{
  fetch(urlFinal)
      .then(res => {
          const dest = fs.createWriteStream(newFilePath);
          res.body.pipe(dest);
      }).then(()=>console.log("finished"))
      .catch(console.error);
  }
const downloadUsingNative = function(cb) {
  let file = fs.createWriteStream(newFilePath);
  let request = http.get(urlFinal, function(response) {
    response.pipe(file);
    file.on('finish', function() {
     console.log("done")
      file.close(cb);

    });
  }).on('error', function(err) {
    fs.unlink(dest);
    if (cb) cb(err.message);
  });
};

const downloadUsingNativePromisified = util.promisify(downloadUsingNative);

downloadUsingNativePromisified().then(console.log).catch(console.error);
您可以使用nodefetch以及nodejs本机代码来实现这一点。我将演示在Nodejs中下载内容的两种方法(使用/不使用第三方Libs):

使用节点获取库下载:

const downloadNew = () => {
    http.get(urlFinal, (res) => {
        const { statusCode } = res;
        const contentType = res.headers['content-type'];

        let error;
        if (statusCode !== 200) {
            error = new Error('Request Failed.\n' +
                `Status Code: ${statusCode}`);
        } 
        
        if (error) {
            console.error(error.message);
            res.resume();
            return;
        }

        res.setEncoding('utf8');
        let rawData = '';
        res.on('data', (chunk) => { rawData += chunk; });
        res.on('end', () => {
            try {
                console.log(rawData);
            } catch (e) {
                console.error(e.message);
            }
        });
    }).on('error', (e) => {
        console.error(`Got error: ${e.message}`);
    });
}
const http = require('http');
const fs = require('fs');
const urlFinal = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4';
const util = require("util");
const fetch = require("node-fetch");
const newFilePath = "/home/amulyakashyap/Desktop/download/BigBuckBunny.mp4";

const downloadUsingFetch => ()=>{
  fetch(urlFinal)
      .then(res => {
          const dest = fs.createWriteStream(newFilePath);
          res.body.pipe(dest);
      }).then(()=>console.log("finished"))
      .catch(console.error);
  }
const downloadUsingNative = function(cb) {
  let file = fs.createWriteStream(newFilePath);
  let request = http.get(urlFinal, function(response) {
    response.pipe(file);
    file.on('finish', function() {
     console.log("done")
      file.close(cb);

    });
  }).on('error', function(err) {
    fs.unlink(dest);
    if (cb) cb(err.message);
  });
};

const downloadUsingNativePromisified = util.promisify(downloadUsingNative);

downloadUsingNativePromisified().then(console.log).catch(console.error);
使用本机Nodejs下载(不支持第三方Lib):

const downloadNew = () => {
    http.get(urlFinal, (res) => {
        const { statusCode } = res;
        const contentType = res.headers['content-type'];

        let error;
        if (statusCode !== 200) {
            error = new Error('Request Failed.\n' +
                `Status Code: ${statusCode}`);
        } 
        
        if (error) {
            console.error(error.message);
            res.resume();
            return;
        }

        res.setEncoding('utf8');
        let rawData = '';
        res.on('data', (chunk) => { rawData += chunk; });
        res.on('end', () => {
            try {
                console.log(rawData);
            } catch (e) {
                console.error(e.message);
            }
        });
    }).on('error', (e) => {
        console.error(`Got error: ${e.message}`);
    });
}
const http = require('http');
const fs = require('fs');
const urlFinal = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4';
const util = require("util");
const fetch = require("node-fetch");
const newFilePath = "/home/amulyakashyap/Desktop/download/BigBuckBunny.mp4";

const downloadUsingFetch => ()=>{
  fetch(urlFinal)
      .then(res => {
          const dest = fs.createWriteStream(newFilePath);
          res.body.pipe(dest);
      }).then(()=>console.log("finished"))
      .catch(console.error);
  }
const downloadUsingNative = function(cb) {
  let file = fs.createWriteStream(newFilePath);
  let request = http.get(urlFinal, function(response) {
    response.pipe(file);
    file.on('finish', function() {
     console.log("done")
      file.close(cb);

    });
  }).on('error', function(err) {
    fs.unlink(dest);
    if (cb) cb(err.message);
  });
};

const downloadUsingNativePromisified = util.promisify(downloadUsingNative);

downloadUsingNativePromisified().then(console.log).catch(console.error);

如果对你有用的话。请将答案向上投票。

但我不需要将文件写入磁盘,我只需要将其数据作为字符串存储在内存中。这不是我不需要用
fs
创建文件的另一种方法吗?@Fabiotk我已经更新了答案,请检查答案中的第一种方法。我希望它对你有用。另请参阅此链接: