diff --git a/src/components/HintText.tsx b/src/components/HintText.tsx index ace88c4..bf74f44 100644 --- a/src/components/HintText.tsx +++ b/src/components/HintText.tsx @@ -5,7 +5,7 @@ type Props = { showUpload?: boolean }; const HintText: React.FC = ({ showUpload = true }) => { const text = showUpload - ? '提示:支持输入多行文本与上传图片。按 Enter 发送,Shift+Enter 换行。' + ? '提示:支持输入多行文本、上传图片或粘贴剪贴板图片。按 Enter 发送,Shift+Enter 换行。' : '提示:支持输入多行文本。按 Enter 发送,Shift+Enter 换行。'; return
{text}
; }; diff --git a/src/components/InputPanel.tsx b/src/components/InputPanel.tsx index 35f65c5..a0c1bce 100644 --- a/src/components/InputPanel.tsx +++ b/src/components/InputPanel.tsx @@ -107,6 +107,49 @@ const InputPanel: React.FC = ({ onResult, showUpload = true, mo } }; + // 处理剪贴板粘贴图片:将图片加入上传列表,复用现有上传流程 + const onPaste = (e: React.ClipboardEvent) => { + if (!showUpload || loading) return; + + const items = e.clipboardData?.items; + if (!items || items.length === 0) return; + + const pastedImages: File[] = []; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (item.kind === 'file') { + const file = item.getAsFile(); + if (file && file.type.startsWith('image/')) { + pastedImages.push(file); + } + } + } + + if (pastedImages.length > 0) { + // 避免将图片以奇怪文本形式粘贴进输入框 + e.preventDefault(); + + const newList = pastedImages.map((file, idx) => { + const ext = (file.type.split('/')[1] || 'png').toLowerCase(); + const name = file.name && file.name.trim().length > 0 ? file.name : `pasted-image-${Date.now()}-${idx}.${ext}`; + return { + uid: `${Date.now()}-${Math.random()}-${idx}`, + name, + status: 'done', + originFileObj: file, + } as any; + }); + + // 受控更新并遵守最大数量限制 + setFileList((prev) => { + const merged = [...prev, ...newList]; + return merged.slice(0, 9); + }); + + message.success(`已添加${pastedImages.length}张剪贴板图片`); + } + }; + return (
= ({ onResult, showUpload = true, mo autoSize={{ minRows: 6, maxRows: 12 }} style={{ fontSize: 14 }} onKeyDown={onKeyDown} + onPaste={onPaste} disabled={loading} />