/** * 客户端文件下载工具 * * 覆盖以下重复模式: * - grades/export-button.tsx 中的 downloadBase64File * - users/user-import-dialog.tsx 中的 downloadBase64File * - audit/audit-log-export-button.tsx 中的 Blob 下载逻辑 * * 注意:仅在客户端使用(依赖 document、URL.createObjectURL 等 API)。 */ const EXCEL_MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /** * 将 base64 编码的数据下载为文件 * @param base64 base64 编码的文件内容 * @param filename 下载文件名 * @param mimeType MIME 类型,默认为 Excel */ export function downloadBase64File( base64: string, filename: string, mimeType: string = EXCEL_MIME_TYPE ): void { const binary = atob(base64) const bytes = new Uint8Array(binary.length) for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i) const blob = new Blob([bytes], { type: mimeType }) downloadBlob(blob, filename) } /** * 将 Blob 数据下载为文件 * @param blob Blob 数据 * @param filename 下载文件名 */ export function downloadBlob(blob: Blob, filename: string): void { const url = URL.createObjectURL(blob) const a = document.createElement("a") a.href = url a.download = filename document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) }