使用puppeteer完成监听浏览器下载文件并保存到自己本地或服务器上完成上传功能

这篇具有很好参考价值的文章主要介绍了使用puppeteer完成监听浏览器下载文件并保存到自己本地或服务器上完成上传功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求场景

获取网站点击的下载pdf,并把pdf重命名再上传到COS云上面

技术使用

“puppeteer”: “^19.7.2”,
“egg”: “^3.15.0”, // 服务期用egg搭的
文件服务使用COS腾讯云

核心思路

获取浏览器下载事件,并把文件保存到本地

const session = await substitutePage.target()
      .createCDPSession();
    await session.send('Page.setDownloadBehavior', {
      behavior: 'allow',
      downloadPath, // 指定文件保存路径回家
    });

在保存到本地前监听此文件夹,如果有文件则获取并上传
加timer做防抖是为了防止在文件写入时以及重命名文件时多次触发watch函数,导致出会出现0KB源文件脏数据

 let timer: any = null;
 fs.watch(downloadPath, async (_eventType, filename) => {
 if (timer !== null) {
 clearTimeout(timer);
   }
   timer = setTimeout(() => {
     // 防止出现下载的临时文件就触发
     if (filename.endsWith('.pdf')) {
       resolve({
         filename,
       });
     }
   }, 500);
 });

完整代码

    const session = await substitutePage.target()
      .createCDPSession();
    await session.send('Page.setDownloadBehavior', {
      behavior: 'allow',
      downloadPath, // 指定文件保存路径回家
    });
     // res就是文件相关信息了
    const [ res ] = await this.downloadPdfHandler(substitutePage, downloadPath);
    // filePath就是自己本地的文件所在绝对路径
    const filePath = `${downloadPath}/${res.fileName}`;
    // uploadFile是cos文件上传相关实现, 我就不放了,有私密的key
    const pdfUriCode = await this.uploadFile(filePath, filePath);
    const pdfUri = decodeURIComponent(pdfUriCode);
    this.domainList = {
      pdfSize: res.pdfSize,
      pdfUri: pdfUri.substring(pdfUri.indexOf('root')),
    };

downloadPdfHandler函数实现文章来源地址https://www.toymoban.com/news/detail-851973.html

  downloadPdfHandler(page, downloadPath): Promise<any> {
    const uuidName = uuidv4();
    const fsWatchApi = () => {
      // 使用防抖是为了防止下载的文件没有写入完全就重命名,那样会产生一个脏文件
      let timer: any = null;
      return new Promise<{ filename: string }>(resolve => {
        fs.watch(downloadPath, async (_eventType, filename) => {
          if (timer !== null) {
            clearTimeout(timer);
          }
          timer = setTimeout(() => {
            // 防止出现下载的临时文件就触发
            if (filename.endsWith('.pdf')) {
              resolve({
                filename,
              });
            }
          }, 500);
        });
      });
    };

    function responseWatchApi() {
      return new Promise<void>(resolve => {
        page.on('response', async response => {
          // 检查响应是否为application/octet-stream且可能包含PDF(或你期望的其他文件类型)
          if (response.headers()['content-type'].startsWith('application/octet-stream')) {
            resolve();
          }
        });
      });
    }

    return new Promise(async (resolve, reject) => {
      try {

        const [ , { filename }] = await Promise.all([ responseWatchApi(), fsWatchApi() ]);
        const oldFilePath = path.join(downloadPath, filename);
        const newFilePath = path.join(downloadPath, `${uuidName}.pdf`);
        try {
          fs.renameSync(oldFilePath, newFilePath);
          this.logger.info(`文件名已经被修改完成:${uuidName}`);
        } catch (error) {
          this.logger.info(`文件名已经被修改完成:${uuidName}`);
        }
        await this.sleep(5 * 1000);
        const files = fs.readdirSync(downloadPath);
        // 创建一个数组,将文件名和其mtime(最后修改时间)一起存储
        const filesWithMtime = files.map(file => {
          const filePath = path.join(downloadPath, file);
          const stats = fs.statSync(filePath);
          return { fileName: file, mtime: stats.mtime, size: stats.size };
        });
        const newestFile = filesWithMtime.sort((a, b) => b.mtime.getTime() - a.mtime.getTime())[0];
        this.logger.info('newestFile: %o', {
          newestFile,
        });
        resolve({
          pdfSize: newestFile.size,
          fileName: newestFile.fileName,
        });

      } catch (e) {
        reject(e);
      }
    });
  }

到了这里,关于使用puppeteer完成监听浏览器下载文件并保存到自己本地或服务器上完成上传功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 动态监听浏览器窗口变化

    定义一个属性记录宽度 在 vue mounted 的时候 去挂载一下 window.onresize 方法 去监听这个 属性值的变化,如果发生变化则讲这个 val 传递给 this.screenWidth 这样screenWidth就跟随浏览器的窗口大小动态变化了 进行使用

    2024年02月13日
    浏览(35)
  • vue 监听浏览器网页关闭和网页刷新事件

    1、监听浏览器页面关闭/刷新事件。 运用场景:浏览器页面关闭后删除local storage、session、cookie、发送请求等。 2、只监听浏览器关闭事件

    2024年02月13日
    浏览(40)
  • Selenium最新版谷歌浏览器驱动的下载及使用

    首先需要在Google浏览器设置里的关于Chrome中查看Google浏览器的版本: 再在接下来的链接中找到对应的版本,一般大版本对应就行,即117.0.5938.63中的117对应即可 https://googlechromelabs.github.io/chrome-for-testing/ 以上链接提供了最新版本的Google驱动器,如果需要Other Versions,可前往:

    2024年02月08日
    浏览(38)
  • 使用hutool工具(ZipUtil)对多文件打包压缩并通过浏览器下载

    使用hutool工具对多文件进行打包压缩并下载 需求 工作中遇到需要将详情页面数据导出为word,同时详情中有图片和附件,由于附件没法写入到word中(可能是自己没有找到对应的解决办法) , 故将需要导出的word文件,和附件一同打包成zip,进行下载 实现 共两个步骤 1 . 使用hutool对多文

    2024年02月12日
    浏览(30)
  • JS监听浏览器关闭、刷新及切换标签页触发事件

    蛮简单的东西,知道就会,不知道就不会,没什么逻辑可言。简单记录一下,只为加深点儿印象。 visibilitychange visibilitychange可以监听到浏览器的切换标签页。  直接上代码:  beforeunload  beforeunload可以监听到页面的关闭,页签切换不会触发 关闭浏览器窗口的时候触发 通过点

    2024年02月08日
    浏览(41)
  • selenium如何打开浏览器,等待用户输入完成后,再运行

    在使用 Selenium 打开浏览器后等待用户输入完成,可以使用 Python 编写一个简单的脚本来实现。首先,确保你已经安装了 Selenium 和对应的浏览器驱动程序。 以下是一个使用 Selenium 在 Chrome 浏览器中等待用户输入完成后再执行的示例脚本: 在这个示例中,脚本会打开一个指定的

    2024年02月14日
    浏览(22)
  • MIUI国际/欧版使用小米应用商店/国内浏览器-解决不会下载软件/上网问题

    MIUI国际版/欧版系统十分简洁,并且内置软件和大陆全部不同,导致新手使用门槛很高 最常见的就是手机上网和软件下载这2大问题。国际版预装的是Googlplay商店,想要下载 软件必须在手机上登录后,才能使用play商店下载;浏览器方面,预装的一般是chrome浏 览器,虽然可以手

    2024年02月08日
    浏览(29)
  • 解决selenium使用chrome下载文件(如pdf)时,反而打开浏览器的预览界面

    在初始化浏览器的时候,添加以下配置即可: 使用如下程序初始化,可以避免很多问题: 在需要下载文件时,只需要直接 browser.get(网络文件URL) 即可直接下载文件到配置的 \\\"C:UsersUser4Downloads\\\" 路径下:

    2024年02月04日
    浏览(44)
  • chrome浏览器技巧,如何查看web页面上元素绑定的监听事件

    第一步:首先通过 F12 进入开发者工具页面。 第二步:选中 Elements 页签内对应的元素,可以用一个按钮来试一试。 第三步:右边选择 Event Listeners 页签,并取消勾选 Ancestors All。这个包含该元素所有父类绑定的监听事件。 如下图所示:图中的提示框的确定按钮就绑定了一个

    2024年02月13日
    浏览(36)
  • 只需浏览器!在线完成Flutter从编程到打包全过程

    本文作者:林梓泓 云端 IDE 是基于云的集成开发环境,开发人员可以 远程编写运行和调试代码 ,无需本地安装,仅通过浏览器即可开发软件。 与传统本地开发相比,云端开发环境主要有以下的优势: 快速启动项目进入开发状态,无需进行繁琐的环境配置 可根据项目需求灵

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包