繁体   English   中英

如何通过直接链接 Puppeteer 下载文件?

[英]How to download file with direct link Puppeteer?

我需要用 puppeteer 下载图像。 这里的问题,通过 goto 方法返回缓冲区。 我认为它返回序列作为图像加载。 所以 writeFile 方法只获取最后一个缓冲区。 是否有其他 promise 方法来处理序列缓冲区?

const puppeteer = require('puppeteer-core');
const fs = require('fs').promises;

(async () => {
  const options = {
   product: 'chrome',
   headless: true,
   pipe: true,
   executablePath: 'chrome.exe'
  };

  const browser = await puppeteer.launch(options);
  const page = await browser.newPage();
  const response = await page.goto('https://static.wikia.nocookie.net/naruto/images/d/dd/Naruto_Uzumaki%21%21.png/revision/latest?cb=20161013233552');
  
  // save buffer to file
  await fs.writeFile('file.jpg', await response.buffer());
  browser.close();
})();

用 puppeteer 下载简直就是地狱……

用于在您电脑上的文件夹中简单下载:

await page._client.send('Page.setDownloadBehavior', {behavior: 'allow', 
    downloadPath: 'C:\folder...'}); // this set the destionation of file dowloaded by pup.
// then page.goto ....

这是一个完整的例子:你可以用来下载任何类型的资源,如果需要登录:-)

const puppeteer = require('puppeteer');
const fs = require('fs').promises;

(async () => {

let browser = await puppeteer.launch();
let page = await browser.newPage();
await page.goto('https://static.wikia.nocookie.net')

// ...eventually login

let fn = async (URI) => {
    // fetch the page from inside the html page
    const res = await fetch(URI, {'credentials': 'same-origin'});

    // attachment; filename="...."; size="1234"
    let str = res.headers.get('Content-Disposition');
    const regex = /filename="([^"]*)".*size="([^"]*)"/gm;

    let m = regex.exec(str);
    let filename = m?m[1]:null;
    let size = m?m[2]:null;
    let blob = await res.blob()
    let bufferArray = await blob.arrayBuffer();

    var base64String = btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))

    return {base64String, size, filename};
}

let x = await page.evaluate(fn, 'https://static.wikia.nocookie.net/naruto/images/d/dd/Naruto_Uzumaki%21%21.png/revision/latest?cb=20161013233552')

// x.base64String <- buffer, you can write
// x.filename <- name of file downloaded
// x.size <- size

// console.log(x.blob)

await fs.writeFile('message1.png', x.base64String, {encoding: "base64"})
console.log('ok!')

})().then();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM