()
| 228 | |
| 229 | // 独立的文件选择并保存函数(用于消息编辑等场景) |
| 230 | export async function selectAndSaveAttachments(): Promise<FileAttachment[]> { |
| 231 | const result = await window.api.selectFiles({ |
| 232 | multiple: true, |
| 233 | filters: [{ name: 'Images', extensions: ['jpg', 'jpeg', 'png', 'gif', 'webp'] }] |
| 234 | }) |
| 235 | |
| 236 | if (!result.success || result.cancelled || !result.files) { |
| 237 | return [] |
| 238 | } |
| 239 | |
| 240 | const attachments: FileAttachment[] = [] |
| 241 | |
| 242 | for (const file of result.files) { |
| 243 | const mimeType = getMimeType(file.name) |
| 244 | |
| 245 | if (!ALLOWED_TYPES.includes(mimeType)) { |
| 246 | console.warn(`不支持的文件类型: ${file.name}`) |
| 247 | continue |
| 248 | } |
| 249 | |
| 250 | if (file.size > MAX_SIZE) { |
| 251 | console.warn(`文件过大: ${file.name} (${(file.size / 1024 / 1024).toFixed(2)}MB)`) |
| 252 | continue |
| 253 | } |
| 254 | |
| 255 | const fileId = generateId() |
| 256 | |
| 257 | const saveResult = await window.api.attachment.save({ |
| 258 | fileId, |
| 259 | fileName: file.name, |
| 260 | base64Content: file.content |
| 261 | }) |
| 262 | |
| 263 | if (saveResult.success && saveResult.localPath) { |
| 264 | attachments.push({ |
| 265 | id: fileId, |
| 266 | name: file.name, |
| 267 | type: mimeType, |
| 268 | size: file.size, |
| 269 | localPath: saveResult.localPath, |
| 270 | createdAt: Date.now() |
| 271 | }) |
| 272 | } else { |
| 273 | console.error('保存附件失败:', saveResult.error) |
| 274 | } |
| 275 | } |
| 276 | |
| 277 | return attachments |
| 278 | } |
no test coverage detected