diff --git a/apps/create-audio/src/App.tsx b/apps/create-audio/src/App.tsx index 2db4033..f0b9aa2 100644 --- a/apps/create-audio/src/App.tsx +++ b/apps/create-audio/src/App.tsx @@ -40,14 +40,49 @@ const initGetText = () => { } return null; }; -const downloadAudio = (url: string, filename?: string) => { - const link = document.createElement('a'); - link.href = url; - const generatedFilename = filename || nanoid(10) + '.wav'; // Generate a random filename - link.download = generatedFilename; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); +const downloadAudio = async (url: string, filename?: string) => { + const generatedFilename = filename || nanoid(10) + '.wav'; + + // 检测是否为移动设备 + const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + + try { + if (isMobile) { + // 移动端处理:使用 fetch 下载并创建 blob URL + const response = await fetch(url); + if (!response.ok) throw new Error('下载失败'); + + const blob = await response.blob(); + const blobUrl = URL.createObjectURL(blob); + + // 在移动端,直接打开新窗口播放/下载 + const newWindow = window.open(blobUrl, '_blank'); + if (!newWindow) { + // 如果无法打开新窗口,提示用户手动下载 + toast.info('请长按音频链接选择"下载"或"保存到文件"'); + return; + } + + // 清理 blob URL + setTimeout(() => { + URL.revokeObjectURL(blobUrl); + }, 1000); + } else { + // 桌面端处理:使用传统的 a 标签下载 + const link = document.createElement('a'); + link.href = url; + link.download = generatedFilename; + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + } catch (error) { + console.error('下载失败:', error); + // 降级处理:直接打开链接 + window.open(url, '_blank'); + toast.info('已在新窗口打开音频文件,请手动保存'); + } }; export const CreateVideos = () => { const [url, setUrl] = useState(''); @@ -118,6 +153,8 @@ export const CreateVideos = () => { margin: '0 auto', padding: '40px 20px', fontFamily: 'Arial, sans-serif', + height: '100vh', + overflowY: 'auto', }}>
{ 停止