diff --git a/src/views/group-management-view.jsx b/src/views/group-management-view.jsx index 6188e4de..01616c2c 100644 --- a/src/views/group-management-view.jsx +++ b/src/views/group-management-view.jsx @@ -967,6 +967,21 @@ const FILE_TYPE_META = { image: ['image', '#3ba55c'], video: ['videocam', '#3b82c4'], audio: ['audiotrack', '#8b5cf6'], document: ['description', '#e05d44'], file: ['insert_drive_file', '#8a8f98'] }; +const DOCUMENT_EXT = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt']; +// POST /groups/{topic}/files 的 file_type 字段是客户端在登记时自己声明的(addGroupFile 的 +// im-api.js 签名早就留了这个参数),不是服务端拿 mime_type 反推的——实测:即使 mime_type 正确 +// 存成 "image/png",只要请求体没带 file_type,服务端就把它落成字面量 "file"(不是留空)。这里 +// 的 onFile 上传流程原来完全没传这个字段,导致真实是图片/视频/语音的群文件在列表里全部显示成 +// 灰色通用文件图标,跟 FILE_TYPE_META 已经准备好的 image/video/audio/document 四种彩色图标从未 +// 对应起来过。跟 content-library-view.jsx 的 fileTypeFromMime 用的是同一套判断(mime 前缀优先, +// 帶附件扩展名兜底文档类型),保持两处"什么算图片/视频/文档"的口径一致。 +function fileTypeFromMime(mime, name) { + const prefix = (mime || '').split('/')[0]; + if (prefix === 'image' || prefix === 'video' || prefix === 'audio') return prefix; + const ext = (/\.([a-zA-Z0-9]+)$/.exec(name || '') || [])[1]; + if (mime === 'application/pdf' || DOCUMENT_EXT.includes((ext || '').toLowerCase())) return 'document'; + return 'file'; +} function GroupFiles({topic, tinode, onToast}) { const [queryInput, setQueryInput] = React.useState(''); @@ -1016,7 +1031,8 @@ function GroupFiles({topic, tinode, onToast}) { if (!file || !tinode) return; setUploading({name: file.name, progress: 0}); uploadLargeFile(tinode, file, frac => setUploading(u => u ? {...u, progress: Math.round(frac * 100)} : u)) - .then(({fileId}) => addGroupFile(topic, {fileId, fileName: file.name, mimeType: file.type, fileSize: file.size})) + .then(({fileId}) => addGroupFile(topic, {fileId, fileName: file.name, mimeType: file.type, fileSize: file.size, + fileType: fileTypeFromMime(file.type, file.name)})) .then(() => { setUploading(null); load(); }) .catch(err => { setUploading(null); onToast(err.message || '上传失败'); }); };