[英]In node.js, how to write binary data from fetch into a file?
Let's say I want to save an image to disk.假设我想将图像保存到磁盘。
var path = require('path');
var webdriver = require("selenium-webdriver");
var chrome = require('selenium-webdriver/chrome');
var By = webdriver.By;
var until = webdriver.until
const fs = require("fs");
var o = new chrome.Options();
o.addArguments("--disable-web-security");
var browser = new webdriver.Builder().forBrowser('chrome').setChromeOptions(o).build();
fetch("https://upload.wikimedia.org/wikipedia/commons/9/9d/Blue_Flower.png");
This doesn't work, fetch is not defined.这不起作用,未定义 fetch。
I then tried adding fetch into browser.executeScript然后我尝试将 fetch 添加到 browser.executeScript
var promise1 = browser.executeScript(`return fetch("https://upload.wikimedia.org/wikipedia/commons/9/9d/Blue_Flower.png");`)
promise1.then((x) => x.arrayBuffer()).then((buffer) => fs.writeFile("flower.png", buffer, () => console.log("done")))
This doesn't work.这不起作用。 It turns out that when executeScript returns an object, all functions in the object are replaced with {}.
原来,当executeScript返回一个对象时,该对象中的所有函数都被替换为{}。
I then tried returning the buffer from executeScript.然后我尝试从 executeScript 返回缓冲区。
var promise1 = browser.executeScript(`return fetch("https://upload.wikimedia.org/wikipedia/commons/9/9d/Blue_Flower.png").then((x) => x.arrayBuffer());`)
promise1.then((buffer) => fs.writeFile("flower.png", buffer, () => console.log("done")))
Still doesn't work.还是不行。 It turns out that buffer becomes {};
原来buffer变成了{};
Is there some way I can access the arrayBuffer without it turning into {} after it comes out of executeScript?有什么方法可以访问 arrayBuffer 而不会在它从 executeScript 出来后变成 {} 吗?
const res = await fetch(url);
const fileWriteStream = fs.createWriteStream('/directory/path.ext');
res.body.pipe(fileWriteStream);
I managed to do it by using base64.我设法通过使用 base64 来做到这一点。 I used code from this answer :
我使用了这个答案中的代码:
var promise1 = browser.executeScript(`return fetch("https://upload.wikimedia.org/wikipedia/commons/9/9d/Blue_Flower.png").then((x) => x.arrayBuffer()).then(function(buffer){
var blob = new Blob([buffer])
var reader = new FileReader();
reader.readAsDataURL(blob);
return reader
}).then(function(reader){
return new Promise(function(x, y){
this.addEventListener("loadend", function(){
x(this);
}.bind(this))
}.bind(reader));
}).then(function(reader){
return reader.result.slice(reader.result.indexOf(",")+1);
})
`)
promise1.then(function(b64data){
let buff = Buffer.from(b64data, 'base64');
fs.writeFileSync("flower.png", buff);
console.log("done");
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.