fe-hunter
fe-hunter copied to clipboard
feat: 乱码问题
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
悬赏100元求解答
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);
}
}
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);
}