如何从节点获取调用中获取原始文件数据?
How to get raw file data from node-fetch calls?
假设我有一个像 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)
我也没有在 documentation 中找到任何关于 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}`);
});
}
您可以使用 node-fetch 以及 nodejs 本机代码来完成。我将演示在 Nodejs 中下载内容的两种方式(with/without 使用第三方库):
使用 Node-Fetch 库下载:
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);
}
使用本机 Nodejs 下载(不支持第三方库):
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);
假设我有一个像 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)
我也没有在 documentation 中找到任何关于 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}`);
});
}
您可以使用 node-fetch 以及 nodejs 本机代码来完成。我将演示在 Nodejs 中下载内容的两种方式(with/without 使用第三方库):
使用 Node-Fetch 库下载:
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);
}
使用本机 Nodejs 下载(不支持第三方库):
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);