接口视频上传
< template> < div class = "component-upload-video" > < el- uploadclass = "avatar-uploader" : action= "uploadImgUrl" : on- progress= "uploadVideoProcess" : on- success= "handleUploadSuccess" : limit= "limit" : file- list= "fileList" : before- upload= "handleBeforeUpload" : show- file- list= "false" : headers= "headers" ref= "uploadRef" > < videov- if = "videoForm.showVideoPath && !videoFlag" : src= "videoForm.showVideoPath" class = "avatar video-avatar" controls= "controls" > 您的浏览器不支持视频播放< / video> < ! -- < iv- else - if = "!videoForm.showVideoPath && !videoFlag" class = "el-icon-plus avatar-uploader-icon" > < / i> < el- progressv- if = "videoFlag == true" type= "circle" : percentage= "videoUploadPercent" style= "margin-top: 7px" > < / el- progress> < / el- upload> < el- buttonv- if = "isShowBtn && videoForm.showVideoPath" class = "mt-20" plainround@click= "handleDelete" size= "small" type= "primary" > 重新上传< i class = "el-icon-upload el-icon--right" > < / i> < / el- button> < / div>
< / template> < script>
import { getToken } from "@/utils/auth" ; export default { props: { value: [ String, Object, Array] , limit: { type: Number, default : 5 , } , fileSize: { type: Number, default : 50 , } , indexValue: { type: Number, default : null , } , fileType: { type: Array, default : ( ) => [ "video/mp4" , "video/ogg" , "video/flv" ] , } , isShowTip: { type: Boolean, default : false , } , isShowUploadVideo: { type: Boolean, default : false , } , isShowBtn: { type: Boolean, default : true , } , } , data ( ) { return { number: 0 , dialogVisible: false , hideUpload: false , uploadImgUrl: process. env. VUE_APP_BASE_API + "/file/upload" , headers: { Authorization: "Bearer " + getToken ( ) , } , fileList: [ ] , videoForm: { showVideoPath: "" , } , duration: 0 , videoFlag: false , videoUploadPercent: 0 , } ; } , watch: { value: { handler ( val ) { if ( val) { this . videoForm. showVideoPath = val; const list = Array. isArray ( val) ? val : this . value. split ( "," ) ; this . fileList = list. map ( ( item ) => { if ( typeof item === "string" ) { item = { name: item, url: item } ; } return item; } ) ; } else { this . fileList = [ ] ; return [ ] ; } } , deep: true , immediate: true , } , } , computed: { showTip ( ) { return this . isShowTip && ( this . fileType || this . fileSize) ; } , } , methods: { handleUploadSuccess ( res ) { this . isShowUploadVideo = true ; this . videoFlag = false ; console. log ( "handleUploadSuccess" ) ; if ( res. code == 200 ) { this . videoForm. showVideoPath = res. data. url; this . $emit ( "input" , res. data. url, this . duration) ; this . $modal. msgSuccess ( "上传成功!" ) ; } else { this . $message. error ( "上传失败!" ) ; } } , handleBeforeUpload ( file ) { var url = URL . createObjectURL ( file) ; var audioElement = new Audio ( url) ; var time; var that = this ; audioElement. addEventListener ( "loadedmetadata" , function ( ) { time = audioElement. duration; that. duration = time; } ) ; var fileSize = file. size / 1024 / 1024 < this . fileSize; if ( [ "video/mp4" ] . indexOf ( file. type) == - 1 ) { this . $modal. msgError ( ` 文件格式不正确, 请上传 ${ this . fileType. join ( "/" ) } 视频格式文件! ` ) ; return false ; } if ( ! fileSize) { this . $modal. msgError ( ` 上传视频大小不能超过 ${ this . fileSize} MB! ` ) ; return false ; } } , uploadVideoProcess ( event, file, fileList ) { this . videoFlag = true ; console. log ( file, "file" , file. percentage) ; this . videoUploadPercent = file. percentage. toFixed ( 0 ) * 1 ; } , handleExceed ( ) { this . $modal. msgError ( ` 上传视频数量不能超过 ${ this . limit} 个! ` ) ; } , handleUploadError ( ) { this . $modal. msgError ( "上传视频失败,请重试" ) ; this . $modal. closeLoading ( ) ; } , handleDelete ( ) { this . videoFlag = false ; this . $refs. uploadRef. clearFiles ( ) ; this . videoForm. showVideoPath = "" ; } , } ,
} ;
< / script> < style scoped lang= "scss" >
: : v- deep. hideUpload . el- upload-- picture- card { display: none;
} : : v- deep . el- upload-- picture- card { width: 104 px; height: 104 px; line- height: 104 px;
} : : v- deep . el- upload- list-- picture- card . el- upload- list__item { width: 104 px; height: 104 px;
} . avatar- uploader- icon { border: 1 px dashed #d9d9d9 ! important;
} . avatar- uploader . el- upload { border: 1 px dashed #d9d9d9 ! important; border- radius: 6 px ! important; position: relative ! important; overflow: hidden ! important;
} . avatar- uploader . el- upload: hover { border: 1 px dashed #d9d9d9 ! important; border- color: #409 eff;
} . avatar- uploader- icon { font- size: 28 px; color: #8 c939d; width: 300 px; height: 178 px; line- height: 178 px; text- align: center;
} . avatar { width: 300 px; height: 178 px; display: block;
}
< / style>
oss直传视频到阿里云组件
< template> < div class = "component-upload-image" > < el- uploadaction= "" : http- request= "beforeUpload" class = "avatar-uploader" : limit= "limit" : on- error= "handleUploadError" : on- exceed= "handleExceed" name= "file" : show- file- list= "false" : file- list= "fileList" ref= "uploadRef" > < videov- if = "videoForm.showVideoPath && !videoFlag" : src= "videoForm.showVideoPath" class = "avatar video-avatar" controls= "controls" > 您的浏览器不支持视频播放< / video> < ! -- < iv- else - if = "!videoForm.showVideoPath && !videoFlag" class = "el-icon-plus avatar-uploader-icon" > < / i> < el- progressv- if = "videoFlag == true" type= "circle" : percentage= "videoUploadPercent" style= "margin-top: 7px" > < / el- progress> < / el- upload> < el- buttonv- if = "isShowBtn && videoForm.showVideoPath" class = "mt-20" plainround@click= "handleDelete" size= "small" type= "primary" > 重新上传< i class = "el-icon-upload el-icon--right" > < / i> < / el- button> < / div>
< / template> < script>
import { getOssParameter } from "./oss" ; export default { props: { value: [ String, Object, Array] , limit: { type: Number, default : 1 , } , fileSize: { type: Number, default : 5120 , } , fileType: { type: Array, default : ( ) => [ "video/*" ] , } , isShowTip: { type: Boolean, default : true , } , isShowUploadVideo: { type: Boolean, default : false , } , isShowBtn: { type: Boolean, default : true , } , } , data ( ) { return { dialogImageUrl: "" , dialogVisible: false , hideUpload: false , baseUrl: process. env. VUE_APP_BASE_API , uploadImgUrl: process. env. VUE_APP_BASE_API + "/file/upload" , fileList: [ ] , videoForm: { showVideoPath: "" , } , videoFlag: false , videoUploadPercent: 0 , isCancel: false , } ; } , watch: { value: { handler ( val ) { if ( val) { this . videoForm. showVideoPath = val; const list = Array. isArray ( val) ? val : this . value. split ( "," ) ; this . fileList = list. map ( ( item ) => { if ( typeof item === "string" ) { item = { name: item, url: item } ; } return item; } ) ; } else { this . fileList = [ ] ; return [ ] ; } } , deep: true , immediate: true , } , } , computed: { showTip ( ) { return this . isShowTip && ( this . fileType || this . fileSize) ; } , } , methods: { Upload ( file, data ) { let OSS = require ( "ali-oss" ) ; let client = new OSS ( { region: data. region, accessKeyId: data. accessKeyId, accessKeySecret: data. accessKeySecret, bucket: data. bucket, } ) ; let cdnUrl = "https://cdn-learning.cscec83.cn/" ; this . isCancel = false ; const tmpcnt = file. file. name. lastIndexOf ( "." ) ; const exname = file. file. name. substring ( tmpcnt + 1 ) ; const fileName = file. file. uid + "." + exname; const progress = ( p, _checkpoint ) => { this . videoFlag = true ; this . videoUploadPercent = Number ( ( Number ( p) * 100 ) . toFixed ( 1 ) ) ; console. log ( this . isCancel) ; if ( this . isCancel) { client. cancel ( ) ; } } ; client. multipartUpload ( fileName, file. file, { progress, partSize: 5 * 1024 * 1024 , } ) . then ( ( res ) => { console. log ( res, "res" ) ; this . videoFlag = false ; if ( res. name) { this . videoForm. showVideoPath = cdnUrl + res. name; console. log ( this . videoForm. showVideoPath, "fileUrl" ) ; this . $emit ( "input" , this . videoForm. showVideoPath, this . duration) ; } else { this . $modal. msgError ( "上传视频失败,请重试" ) ; this . handleDelete ( ) ; } } ) . catch ( ( err ) => { console. log ( err) ; if ( err. name == "cancel" ) { this . $message ( "上传取消" ) ; } else { this . $modal. msgError ( err) ; } this . handleDelete ( ) ; } ) ; } , handleDelete ( ) { this . isCancel = true ; this . videoFlag = false ; this . $refs. uploadRef. clearFiles ( ) ; this . duration = 0 ; this . videoForm. showVideoPath = "" ; this . $emit ( "input" , this . videoForm. showVideoPath, this . duration) ; } , beforeUpload ( file ) { var fileSize = file. file. size / 1024 / 1024 < this . fileSize; console. log ( file. file. type) ; if ( this . fileType. indexOf ( file. file. type) == - 1 ) { this . $modal. msgError ( ` 文件格式不正确, 请上传 ${ this . fileType. join ( "/" ) } 视频格式文件! ` ) ; return false ; } if ( ! fileSize) { this . $modal. msgError ( ` 上传视频大小不能超过 ${ this . fileSize} MB! ` ) ; return false ; } var url = URL . createObjectURL ( file. file) ; var audioElement = new Audio ( url) ; var time; var that = this ; audioElement. addEventListener ( "loadedmetadata" , function ( ) { time = audioElement. duration; that. duration = time; } ) ; getOssParameter ( ) . then ( ( res ) => { if ( res. code == 200 ) { this . Upload ( file, res. data) ; } } ) ; } , handleExceed ( ) { this . $message. error ( ` 上传文件数量不能超过 ${ this . limit} 个! ` ) ; } , handleUploadError ( ) { this . $modal. msgError ( "上传失败,请重试" ) ; } , uploadCancel ( ) { this . isCancel = true ; } , } ,
} ;
< / script>
< style scoped lang= "scss" >
: : v- deep. hideUpload . el- upload-- picture- card { display: none;
} : : v- deep . el- upload-- picture- card { width: 104 px; height: 104 px; line- height: 104 px;
} : : v- deep . el- upload- list-- picture- card . el- upload- list__item { width: 104 px; height: 104 px;
} . avatar- uploader- icon { border: 1 px dashed #d9d9d9 ! important;
} . avatar- uploader . el- upload { border: 1 px dashed #d9d9d9 ! important; border- radius: 6 px ! important; position: relative ! important; overflow: hidden ! important;
} . avatar- uploader . el- upload: hover { border: 1 px dashed #d9d9d9 ! important; border- color: #409 eff;
} . avatar- uploader- icon { font- size: 28 px; color: #8 c939d; width: 300 px; height: 178 px; line- height: 178 px; text- align: center;
} . avatar { width: 300 px; height: 178 px; display: block;
}
< / style>