接口视频上传
< template>
< div class = "component-upload-video" >
< el- upload
class = "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"
>
< video
v- if = "videoForm.showVideoPath && !videoFlag"
: src= "videoForm.showVideoPath"
class = "avatar video-avatar"
controls= "controls"
>
您的浏览器不支持视频播放
< / video>
< ! --
< i
v- else - if = "!videoForm.showVideoPath && !videoFlag"
class = "el-icon-plus avatar-uploader-icon"
> < / i>
< el- progress
v- if = "videoFlag == true"
type= "circle"
: percentage= "videoUploadPercent"
style= "margin-top: 7px"
> < / el- progress>
< / el- upload>
< el- button
v- if = "isShowBtn && videoForm.showVideoPath"
class = "mt-20"
plain
round
@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- upload
action= ""
: 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"
>
< video
v- if = "videoForm.showVideoPath && !videoFlag"
: src= "videoForm.showVideoPath"
class = "avatar video-avatar"
controls= "controls"
>
您的浏览器不支持视频播放
< / video>
< ! --
< i
v- else - if = "!videoForm.showVideoPath && !videoFlag"
class = "el-icon-plus avatar-uploader-icon"
> < / i>
< el- progress
v- if = "videoFlag == true"
type= "circle"
: percentage= "videoUploadPercent"
style= "margin-top: 7px"
> < / el- progress>
< / el- upload>
< el- button
v- if = "isShowBtn && videoForm.showVideoPath"
class = "mt-20"
plain
round
@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>