99 <template v-if =" type === ' video' " >
1010 <Input v-model:value =" videoSrc" placeholder =" 请输入视频地址,e.g. https://xxx.mp4" ></Input >
1111 <div class =" btns" >
12- <Button @click =" emit('close')" style =" margin-right : 10px ;" >取消</Button >
13- <Button type =" primary" @click =" insertVideo()" >确认</Button >
12+ <FileInput accept =" video/*" @change =" files => uploadVideo(files)" >
13+ <Button >上传本地视频</Button >
14+ </FileInput >
15+ <div class =" group" >
16+ <Button @click =" emit('close')" style =" margin-right : 10px ;" >取消</Button >
17+ <Button type =" primary" @click =" insertVideo()" >确认</Button >
18+ </div >
1419 </div >
1520 </template >
1621
1722 <template v-if =" type === ' audio' " >
1823 <Input v-model:value =" audioSrc" placeholder =" 请输入音频地址,e.g. https://xxx.mp3" ></Input >
1924 <div class =" btns" >
20- <Button @click =" emit('close')" style =" margin-right : 10px ;" >取消</Button >
21- <Button type =" primary" @click =" insertAudio()" >确认</Button >
25+ <FileInput accept =" audio/*" @change =" files => uploadAudio(files)" >
26+ <Button >上传本地音频</Button >
27+ </FileInput >
28+ <div class =" group" >
29+ <Button @click =" emit('close')" style =" margin-right : 10px ;" >取消</Button >
30+ <Button type =" primary" @click =" insertAudio()" >确认</Button >
31+ </div >
2232 </div >
2333 </template >
2434 </div >
@@ -30,6 +40,34 @@ import message from '@/utils/message'
3040import Tabs from ' @/components/Tabs.vue'
3141import Input from ' @/components/Input.vue'
3242import Button from ' @/components/Button.vue'
43+ import FileInput from ' @/components/FileInput.vue'
44+
45+ const MIME_MAP: { [key : string ]: string } = {
46+
47+ // 音频类型
48+ ' audio/aac' : ' aac' ,
49+ ' audio/mpeg' : ' mp3' ,
50+ ' audio/ogg' : ' oga' ,
51+ ' audio/wav' : ' wav' ,
52+ ' audio/webm' : ' weba' ,
53+ ' audio/flac' : ' flac' ,
54+ ' audio/mp4' : ' m4a' ,
55+ ' audio/x-aiff' : ' aif' ,
56+ ' audio/x-ms-wma' : ' wma' ,
57+ ' audio/midi' : ' mid' ,
58+
59+ // 视频类型
60+ ' video/mp4' : ' mp4' ,
61+ ' video/mpeg' : ' mpeg' ,
62+ ' video/ogg' : ' ogv' ,
63+ ' video/webm' : ' webm' ,
64+ ' video/x-msvideo' : ' avi' ,
65+ ' video/quicktime' : ' mov' ,
66+ ' video/x-ms-wmv' : ' wmv' ,
67+ ' video/x-flv' : ' flv' ,
68+ ' video/3gpp' : ' 3gp' ,
69+ ' video/3gpp2' : ' 3g2'
70+ }
3371
3472type TypeKey = ' video' | ' audio'
3573interface TabItem {
@@ -38,8 +76,8 @@ interface TabItem {
3876}
3977
4078const emit = defineEmits <{
41- (event : ' insertVideo' , payload : string ): void
42- (event : ' insertAudio' , payload : string ): void
79+ (event : ' insertVideo' , payload : { src : string , ext ? : string } ): void
80+ (event : ' insertAudio' , payload : { src : string , ext ? : string } ): void
4381 (event : ' close' ): void
4482}>()
4583
@@ -55,12 +93,26 @@ const tabs: TabItem[] = [
5593
5694const insertVideo = () => {
5795 if (! videoSrc .value ) return message .error (' 请先输入正确的视频地址' )
58- emit (' insertVideo' , videoSrc .value )
96+ emit (' insertVideo' , { src: videoSrc .value } )
5997}
6098
6199const insertAudio = () => {
62100 if (! audioSrc .value ) return message .error (' 请先输入正确的音频地址' )
63- emit (' insertAudio' , audioSrc .value )
101+ emit (' insertAudio' , { src: audioSrc .value })
102+ }
103+
104+ const uploadVideo = (files : FileList ) => {
105+ const file = files [0 ]
106+ if (! file ) return
107+ const ext = MIME_MAP [file .type ] || ' '
108+ emit (' insertVideo' , { src: URL .createObjectURL (file ), ext })
109+ }
110+
111+ const uploadAudio = (files : FileList ) => {
112+ const file = files [0 ]
113+ if (! file ) return
114+ const ext = MIME_MAP [file .type ] || ' '
115+ emit (' insertAudio' , { src: URL .createObjectURL (file ), ext })
64116}
65117 </script >
66118
@@ -70,6 +122,7 @@ const insertAudio = () => {
70122}
71123.btns {
72124 margin-top : 10px ;
73- text-align : right ;
125+ display : flex ;
126+ justify-content : space-between ;
74127}
75128 </style >
0 commit comments