fix: 修复下载功能,通过background script直接下载到默认目录
- 下载改由background script处理,使用chrome.downloads.download API - 添加chrome.runtime.sendMessage类型定义 - 修复SVG图标路径错误 - 使用Data URL方式确保下载可靠性 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
6045cbe6ad
commit
bf3b4548b0
@ -1,34 +1,31 @@
|
|||||||
// Background Service Worker
|
// Background Service Worker
|
||||||
// 处理下载等后台任务
|
// 处理下载等后台任务
|
||||||
|
|
||||||
import type { ExtractedContent } from '../types';
|
|
||||||
import { generateMarkdown } from '../utils/markdown';
|
|
||||||
import { downloadMarkdown, generateFilename } from '../utils/download';
|
|
||||||
|
|
||||||
// 监听来自popup的消息
|
// 监听来自popup的消息
|
||||||
chrome.runtime.onMessage.addListener((message: any, _sender: any, sendResponse: (response?: any) => void) => {
|
chrome.runtime.onMessage.addListener((message: any, _sender: any, sendResponse: (response?: any) => void) => {
|
||||||
if (message.action === 'download') {
|
if (message.action === 'download') {
|
||||||
handleDownload(message.data)
|
handleDownload(message.filename, message.content)
|
||||||
.then(() => sendResponse({ success: true }))
|
.then(() => sendResponse({ success: true }))
|
||||||
.catch(error => sendResponse({ success: false, error: error?.message || 'Download failed' }));
|
.catch(error => sendResponse({ success: false, error: error?.message || 'Download failed' }));
|
||||||
return true; // 异步响应
|
return true; // 异步响应
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.action === 'copy') {
|
|
||||||
sendResponse({ success: false, error: 'Copy should be handled in popup' });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
// 处理下载
|
// 处理下载 - 直接下载到默认目录
|
||||||
async function handleDownload(data: { content: ExtractedContent; options: { includeTitle: boolean; includeUrl: boolean } }): Promise<void> {
|
async function handleDownload(filename: string, content: string): Promise<void> {
|
||||||
const { content, options } = data;
|
// 使用 Data URL 方式(更可靠)
|
||||||
const markdown = generateMarkdown(content, options);
|
const dataUrl = `data:text/markdown;charset=utf-8,${encodeURIComponent(content)}`;
|
||||||
const filename = generateFilename(content.title);
|
|
||||||
|
|
||||||
await downloadMarkdown(markdown, filename);
|
// 使用 chrome.downloads.download 直接下载到默认目录
|
||||||
|
const downloadId = await chrome.downloads.download({
|
||||||
|
url: dataUrl,
|
||||||
|
filename: filename,
|
||||||
|
saveAs: false // 直接保存到默认下载目录
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('ReadMD: Download initiated', downloadId, filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下载完成后清理
|
// 下载完成后清理
|
||||||
|
|||||||
@ -76,7 +76,7 @@ export function Popup() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 下载文件
|
// 下载文件 - 通过 background script 直接下载到默认目录
|
||||||
const handleDownload = async () => {
|
const handleDownload = async () => {
|
||||||
if (!extractedContent) return;
|
if (!extractedContent) return;
|
||||||
|
|
||||||
@ -86,16 +86,15 @@ export function Popup() {
|
|||||||
includeUrl: settings.includeUrl
|
includeUrl: settings.includeUrl
|
||||||
});
|
});
|
||||||
|
|
||||||
const blob = new Blob([markdown], { type: 'text/markdown;charset=utf-8' });
|
|
||||||
const url = URL.createObjectURL(blob);
|
|
||||||
const filename = `${extractedContent.title.replace(/[<>:"/\\|?*]/g, '_').substring(0, 100)}.md`;
|
const filename = `${extractedContent.title.replace(/[<>:"/\\|?*]/g, '_').substring(0, 100)}.md`;
|
||||||
await chrome.downloads.download({
|
|
||||||
url: url,
|
// 发送消息给 background script 处理下载
|
||||||
|
await chrome.runtime.sendMessage({
|
||||||
|
action: 'download',
|
||||||
filename: filename,
|
filename: filename,
|
||||||
saveAs: false
|
content: markdown
|
||||||
});
|
});
|
||||||
|
|
||||||
URL.revokeObjectURL(url);
|
|
||||||
showStatus('success', '开始下载...');
|
showStatus('success', '开始下载...');
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
window.close();
|
window.close();
|
||||||
@ -200,7 +199,7 @@ export function Popup() {
|
|||||||
>
|
>
|
||||||
<svg className="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
<svg className="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
||||||
<circle cx="12" cy="12" r="3"/>
|
<circle cx="12" cy="12" r="3"/>
|
||||||
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 2.0 1 83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/>
|
<path d="M12.36 6v1.2M12.36 16.8v1.2M6.36 12H5.16M18.84 12h-1.2M8.4 8.4l-.85.85M16.45 15.55l-.85.85M8.4 15.6l-.85-.85M16.45 8.45l-.85-.85"/>
|
||||||
</svg>
|
</svg>
|
||||||
设置
|
设置
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
1
src/types/chrome.d.ts
vendored
1
src/types/chrome.d.ts
vendored
@ -8,6 +8,7 @@ declare const chrome: {
|
|||||||
onMessage: {
|
onMessage: {
|
||||||
addListener: (callback: (message: any, sender: any, sendResponse: (response?: any) => void) => boolean | void) => void;
|
addListener: (callback: (message: any, sender: any, sendResponse: (response?: any) => void) => boolean | void) => void;
|
||||||
};
|
};
|
||||||
|
sendMessage: (message: any) => Promise<any>;
|
||||||
openOptionsPage: () => Promise<void>;
|
openOptionsPage: () => Promise<void>;
|
||||||
};
|
};
|
||||||
downloads: {
|
downloads: {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user