fe-hunter icon indicating copy to clipboard operation
fe-hunter copied to clipboard

feat: 乱码问题

Open rong9490 opened this issue 1 year ago • 4 comments

rong9490 avatar Nov 14 '23 07:11 rong9490

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

imondo avatar Nov 14 '23 07:11 imondo

悬赏100元求解答

rong9490 avatar Nov 15 '23 02:11 rong9490

protected async excel文件下载(url: string, payload: any) {
  const getBuffer = new Promise<Buffer>((resolve, reject) => {
    this.page.once('response', async (response) => {
      if (!response.url().includes(url)) return;
      try {
        const buffer = await response.buffer();
        console.log('拦截的buffer大小', buffer.length);
        resolve(buffer);
      } catch (error) {
        reject(error);
      }
    });

    this.page!.evaluate(
      (opts) => {
        return fetch(opts.url, {
          method: 'POST',
          body: JSON.stringify(opts.payload),
          headers: {
            'Content-Type': 'application/json;charset=UTF-8'
          },
        });
      },
      {
        url,
        payload,
      },
    );
  });

  const timer = new Promise<undefined>((resolve) => setTimeout(resolve, 1000 * 30));
  try {
    const fileBuffer = await Promise.race([getBuffer, timer]);
    if (fileBuffer) {
      console.log('内部fileBuffer', fileBuffer.length);
      const fs = require('fs');
      fs.writeFileSync('downloaded_file.xls', fileBuffer); // 直接将buffer写入文件
    } else {
      console.log('下载超时或未能正确接收文件');
    }
  } catch (error) {
    console.error('下载过程中出现错误', error);
  }
}

JexLau avatar Nov 15 '23 02:11 JexLau

protected async excel文件下载(url: string, payload: any) {
  const getBuffer = new Promise<any>((resolve) => {
    this.page.once('response', async (response) => {
      if (!response.url().includes(url)) return;
      const text = await response.text(); // 使用text()方法获取文本数据
      const buffer = Buffer.from(text, 'binary'); // 手动将文本转换为Buffer
      console.log('拦截的buffer大小', buffer?.length);
      resolve(buffer);
    });

    this.page!.evaluate(
      (opts) => {
        return fetch(opts.url, {
          method: 'POST',
          body: JSON.stringify(opts.payload),
          headers: {
            responseType: 'arrayBuffer',
            'Content-Type': 'application/json;charset=UTF-8',
            'Content-Disposition':
              'attachment;filename=2023-11-01%E6%97%A5%E5%89%8D%E8%8A%82%E7%82%B9%E7%94%B5%E4%BB%B7%E6%9F%A5%E8%AF%A2.xls',
          },
        }).then(async (res) => {
          const text = await res.text();
          const blob = new Blob([text], { type: 'application/vnd.ms-excel;charset=UTF-8' });
          return blob;
        });
      },
      {
        url,
        payload,
      },
    );
  });
  const timer = new Promise<undefined>((resolve) => setTimeout(resolve, 1000 * 30));
  const fileBuffer: any = await Promise.race([getBuffer, timer]);

  console.log('内部fileBuffer', fileBuffer!.length);
}

SouthLink avatar Nov 15 '23 02:11 SouthLink