国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用puppeteer完成監(jiān)聽瀏覽器下載文件并保存到自己本地或服務(wù)器上完成上傳功能

這篇具有很好參考價(jià)值的文章主要介紹了使用puppeteer完成監(jiān)聽瀏覽器下載文件并保存到自己本地或服務(wù)器上完成上傳功能。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

需求場(chǎng)景

獲取網(wǎng)站點(diǎn)擊的下載pdf,并把pdf重命名再上傳到COS云上面

技術(shù)使用

“puppeteer”: “^19.7.2”,
“egg”: “^3.15.0”, // 服務(wù)期用egg搭的
文件服務(wù)使用COS騰訊云

核心思路

獲取瀏覽器下載事件,并把文件保存到本地

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

在保存到本地前監(jiān)聽此文件夾,如果有文件則獲取并上傳
加timer做防抖是為了防止在文件寫入時(shí)以及重命名文件時(shí)多次觸發(fā)watch函數(shù),導(dǎo)致出會(huì)出現(xiàn)0KB源文件臟數(shù)據(jù)

 let timer: any = null;
 fs.watch(downloadPath, async (_eventType, filename) => {
 if (timer !== null) {
 clearTimeout(timer);
   }
   timer = setTimeout(() => {
     // 防止出現(xiàn)下載的臨時(shí)文件就觸發(fā)
     if (filename.endsWith('.pdf')) {
       resolve({
         filename,
       });
     }
   }, 500);
 });

完整代碼

    const session = await substitutePage.target()
      .createCDPSession();
    await session.send('Page.setDownloadBehavior', {
      behavior: 'allow',
      downloadPath, // 指定文件保存路徑回家
    });
     // res就是文件相關(guān)信息了
    const [ res ] = await this.downloadPdfHandler(substitutePage, downloadPath);
    // filePath就是自己本地的文件所在絕對(duì)路徑
    const filePath = `${downloadPath}/${res.fileName}`;
    // uploadFile是cos文件上傳相關(guān)實(shí)現(xiàn), 我就不放了,有私密的key
    const pdfUriCode = await this.uploadFile(filePath, filePath);
    const pdfUri = decodeURIComponent(pdfUriCode);
    this.domainList = {
      pdfSize: res.pdfSize,
      pdfUri: pdfUri.substring(pdfUri.indexOf('root')),
    };

downloadPdfHandler函數(shù)實(shí)現(xiàn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-851973.html

  downloadPdfHandler(page, downloadPath): Promise<any> {
    const uuidName = uuidv4();
    const fsWatchApi = () => {
      // 使用防抖是為了防止下載的文件沒(méi)有寫入完全就重命名,那樣會(huì)產(chǎn)生一個(gè)臟文件
      let timer: any = null;
      return new Promise<{ filename: string }>(resolve => {
        fs.watch(downloadPath, async (_eventType, filename) => {
          if (timer !== null) {
            clearTimeout(timer);
          }
          timer = setTimeout(() => {
            // 防止出現(xiàn)下載的臨時(shí)文件就觸發(fā)
            if (filename.endsWith('.pdf')) {
              resolve({
                filename,
              });
            }
          }, 500);
        });
      });
    };

    function responseWatchApi() {
      return new Promise<void>(resolve => {
        page.on('response', async response => {
          // 檢查響應(yīng)是否為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(`文件名已經(jīng)被修改完成:${uuidName}`);
        } catch (error) {
          this.logger.info(`文件名已經(jīng)被修改完成:${uuidName}`);
        }
        await this.sleep(5 * 1000);
        const files = fs.readdirSync(downloadPath);
        // 創(chuàng)建一個(gè)數(shù)組,將文件名和其mtime(最后修改時(shí)間)一起存儲(chǔ)
        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);
      }
    });
  }

到了這里,關(guān)于使用puppeteer完成監(jiān)聽瀏覽器下載文件并保存到自己本地或服務(wù)器上完成上傳功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3 動(dòng)態(tài)監(jiān)聽瀏覽器窗口變化

    定義一個(gè)屬性記錄寬度 在 vue mounted 的時(shí)候 去掛載一下 window.onresize 方法 去監(jiān)聽這個(gè) 屬性值的變化,如果發(fā)生變化則講這個(gè) val 傳遞給 this.screenWidth 這樣screenWidth就跟隨瀏覽器的窗口大小動(dòng)態(tài)變化了 進(jìn)行使用

    2024年02月13日
    瀏覽(22)
  • vue 監(jiān)聽瀏覽器網(wǎng)頁(yè)關(guān)閉和網(wǎng)頁(yè)刷新事件

    1、監(jiān)聽瀏覽器頁(yè)面關(guān)閉/刷新事件。 運(yùn)用場(chǎng)景:瀏覽器頁(yè)面關(guān)閉后刪除local storage、session、cookie、發(fā)送請(qǐng)求等。 2、只監(jiān)聽瀏覽器關(guān)閉事件

    2024年02月13日
    瀏覽(19)
  • Selenium最新版谷歌瀏覽器驅(qū)動(dòng)的下載及使用

    Selenium最新版谷歌瀏覽器驅(qū)動(dòng)的下載及使用

    首先需要在Google瀏覽器設(shè)置里的關(guān)于Chrome中查看Google瀏覽器的版本: 再在接下來(lái)的鏈接中找到對(duì)應(yīng)的版本,一般大版本對(duì)應(yīng)就行,即117.0.5938.63中的117對(duì)應(yīng)即可 https://googlechromelabs.github.io/chrome-for-testing/ 以上鏈接提供了最新版本的Google驅(qū)動(dòng)器,如果需要Other Versions,可前往:

    2024年02月08日
    瀏覽(167)
  • 使用hutool工具(ZipUtil)對(duì)多文件打包壓縮并通過(guò)瀏覽器下載

    使用hutool工具對(duì)多文件進(jìn)行打包壓縮并下載 需求 工作中遇到需要將詳情頁(yè)面數(shù)據(jù)導(dǎo)出為word,同時(shí)詳情中有圖片和附件,由于附件沒(méi)法寫入到word中(可能是自己沒(méi)有找到對(duì)應(yīng)的解決辦法) , 故將需要導(dǎo)出的word文件,和附件一同打包成zip,進(jìn)行下載 實(shí)現(xiàn) 共兩個(gè)步驟 1 . 使用hutool對(duì)多文

    2024年02月12日
    瀏覽(58)
  • JS監(jiān)聽瀏覽器關(guān)閉、刷新及切換標(biāo)簽頁(yè)觸發(fā)事件

    蠻簡(jiǎn)單的東西,知道就會(huì),不知道就不會(huì),沒(méi)什么邏輯可言。簡(jiǎn)單記錄一下,只為加深點(diǎn)兒印象。 visibilitychange visibilitychange可以監(jiān)聽到瀏覽器的切換標(biāo)簽頁(yè)。? 直接上代碼:? beforeunload? beforeunload可以監(jiān)聽到頁(yè)面的關(guān)閉,頁(yè)簽切換不會(huì)觸發(fā) 關(guān)閉瀏覽器窗口的時(shí)候觸發(fā) 通過(guò)點(diǎn)

    2024年02月08日
    瀏覽(27)
  • selenium如何打開瀏覽器,等待用戶輸入完成后,再運(yùn)行

    selenium如何打開瀏覽器,等待用戶輸入完成后,再運(yùn)行

    在使用 Selenium 打開瀏覽器后等待用戶輸入完成,可以使用 Python 編寫一個(gè)簡(jiǎn)單的腳本來(lái)實(shí)現(xiàn)。首先,確保你已經(jīng)安裝了 Selenium 和對(duì)應(yīng)的瀏覽器驅(qū)動(dòng)程序。 以下是一個(gè)使用 Selenium 在 Chrome 瀏覽器中等待用戶輸入完成后再執(zhí)行的示例腳本: 在這個(gè)示例中,腳本會(huì)打開一個(gè)指定的

    2024年02月14日
    瀏覽(27)
  • 解決selenium使用chrome下載文件(如pdf)時(shí),反而打開瀏覽器的預(yù)覽界面

    在初始化瀏覽器的時(shí)候,添加以下配置即可: 使用如下程序初始化,可以避免很多問(wèn)題: 在需要下載文件時(shí),只需要直接 browser.get(網(wǎng)絡(luò)文件URL) 即可直接下載文件到配置的 \\\"C:UsersUser4Downloads\\\" 路徑下:

    2024年02月04日
    瀏覽(97)
  • MIUI國(guó)際/歐版使用小米應(yīng)用商店/國(guó)內(nèi)瀏覽器-解決不會(huì)下載軟件/上網(wǎng)問(wèn)題

    MIUI國(guó)際/歐版使用小米應(yīng)用商店/國(guó)內(nèi)瀏覽器-解決不會(huì)下載軟件/上網(wǎng)問(wèn)題

    MIUI國(guó)際版/歐版系統(tǒng)十分簡(jiǎn)潔,并且內(nèi)置軟件和大陸全部不同,導(dǎo)致新手使用門檻很高 最常見(jiàn)的就是手機(jī)上網(wǎng)和軟件下載這2大問(wèn)題。國(guó)際版預(yù)裝的是Googlplay商店,想要下載 軟件必須在手機(jī)上登錄后,才能使用play商店下載;瀏覽器方面,預(yù)裝的一般是chrome瀏 覽器,雖然可以手

    2024年02月08日
    瀏覽(23)
  • chrome瀏覽器技巧,如何查看web頁(yè)面上元素綁定的監(jiān)聽事件

    chrome瀏覽器技巧,如何查看web頁(yè)面上元素綁定的監(jiān)聽事件

    第一步:首先通過(guò) F12 進(jìn)入開發(fā)者工具頁(yè)面。 第二步:選中 Elements 頁(yè)簽內(nèi)對(duì)應(yīng)的元素,可以用一個(gè)按鈕來(lái)試一試。 第三步:右邊選擇?Event Listeners 頁(yè)簽,并取消勾選 Ancestors All。這個(gè)包含該元素所有父類綁定的監(jiān)聽事件。 如下圖所示:圖中的提示框的確定按鈕就綁定了一個(gè)

    2024年02月13日
    瀏覽(29)
  • 只需瀏覽器!在線完成Flutter從編程到打包全過(guò)程

    只需瀏覽器!在線完成Flutter從編程到打包全過(guò)程

    本文作者:林梓泓 云端 IDE 是基于云的集成開發(fā)環(huán)境,開發(fā)人員可以 遠(yuǎn)程編寫運(yùn)行和調(diào)試代碼 ,無(wú)需本地安裝,僅通過(guò)瀏覽器即可開發(fā)軟件。 與傳統(tǒng)本地開發(fā)相比,云端開發(fā)環(huán)境主要有以下的優(yōu)勢(shì): 快速啟動(dòng)項(xiàng)目進(jìn)入開發(fā)狀態(tài),無(wú)需進(jìn)行繁瑣的環(huán)境配置 可根據(jù)項(xiàng)目需求靈

    2024年02月05日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包