fix: 用 chrome.storage.session 传 base64,background 下载

This commit is contained in:
李进
2026-07-27 15:07:51 +08:00
parent 7b8b560dc0
commit 984b03c3d6
2 changed files with 13 additions and 13 deletions
+6 -3
View File
@@ -171,11 +171,14 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
return true; return true;
} }
// 下载 PPTXbase64 data URL // 下载 PPTX从 storage 读取 base64
if (message?.type === "WEB_TO_PPT_DOWNLOAD") { if (message?.type === "WEB_TO_PPT_DOWNLOAD") {
(async () => { (async () => {
const dataUrl = 'data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,' + message.base64; const stored = await chrome.storage.session.get(['pptxBase64', 'pptxFilename']);
await chrome.downloads.download({ url: dataUrl, filename: message.filename }); if (!stored.pptxBase64) throw new Error('没有待下载的数据');
const dataUrl = 'data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,' + stored.pptxBase64;
await chrome.downloads.download({ url: dataUrl, filename: stored.pptxFilename });
await chrome.storage.session.remove(['pptxBase64', 'pptxFilename']);
return { ok: true }; return { ok: true };
})() })()
.then(sendResponse) .then(sendResponse)
+7 -10
View File
@@ -75,27 +75,24 @@ async function exportPptx() {
setProgress(85, '正在打包...'); setProgress(85, '正在打包...');
const blob = await WebToPPT.schemaToPptxBlob(schema); const blob = await WebToPPT.schemaToPptxBlob(schema);
// 5. 下载(data URLpopup 直接调用) // 5. 转 base64
setProgress(95, '正在下载...');
const buffer = await blob.arrayBuffer(); const buffer = await blob.arrayBuffer();
const bytes = new Uint8Array(buffer); const bytes = new Uint8Array(buffer);
let binary = ''; let binary = '';
for (let i = 0; i < bytes.length; i += 0x8000) { for (let i = 0; i < bytes.length; i += 0x8000) {
binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000)); binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
} }
const dataUrl = 'data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,' + btoa(binary); const base64 = btoa(binary);
// 6. 存到 storage,让 background 下载
setProgress(95, '正在下载...');
const title = dataResult.data.source?.title || 'webpage'; const title = dataResult.data.source?.title || 'webpage';
const safeTitle = title.replace(/[\\/:*?"<>|]+/g, '-').replace(/\s+/g, '-').slice(0, 64) || 'webpage'; const safeTitle = title.replace(/[\\/:*?"<>|]+/g, '-').replace(/\s+/g, '-').slice(0, 64) || 'webpage';
const filename = `web-to-ppt/${safeTitle}-${Date.now()}.pptx`; const filename = `web-to-ppt/${safeTitle}-${Date.now()}.pptx`;
try { await chrome.storage.session.set({ pptxBase64: base64, pptxFilename: filename });
const dlId = await chrome.downloads.download({ url: dataUrl, filename }); const dlResult = await chrome.runtime.sendMessage({ type: 'WEB_TO_PPT_DOWNLOAD' });
console.log('[WebToPPT] download id:', dlId); if (!dlResult || !dlResult.ok) throw new Error(dlResult?.error || '下载失败');
} catch (e) {
console.error('[WebToPPT] download error:', e.message, e);
throw e;
}
setProgress(100, '导出完成'); setProgress(100, '导出完成');
setResult('success', '导出完成'); setResult('success', '导出完成');