You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
6.3 KiB
218 lines
6.3 KiB
<template> |
|
<div class="upload-container"> |
|
<el-button |
|
:style="{ background: color, borderColor: color }" |
|
icon="el-icon-upload" |
|
size="mini" |
|
type="primary" |
|
@click="uploadClick" |
|
> |
|
<!-- upload --> |
|
上传 |
|
</el-button> |
|
<el-dialog :visible.sync="dialogVisible" :append-to-body="true"> |
|
<el-upload |
|
:multiple="true" |
|
:headers="headers" |
|
:file-list="fileList" |
|
:show-file-list="true" |
|
:on-remove="handleRemove" |
|
:on-success="handleSuccess" |
|
:data="dataObj" |
|
class="editor-slide-upload" |
|
:action="action" |
|
list-type="picture-card" |
|
> |
|
<el-button size="small" type="primary"> |
|
上传图片 |
|
</el-button> |
|
</el-upload> |
|
<!-- action必选参数, 上传的地址 --> |
|
<el-upload |
|
class="avatar-uploader el-upload--text" |
|
:action="action" |
|
:data="dataObj" |
|
:headers="headers" |
|
:show-file-list="false" |
|
:on-success="handleVideoSuccess" |
|
:before-upload="beforeUploadVideo" |
|
:on-progress="uploadVideoProcess" |
|
> |
|
<video |
|
class="video-js" |
|
v-if="videoUrl != '' && videoFlag == false" |
|
controls |
|
autoplay="muted" |
|
preload="auto" |
|
poster="../../../assets/logo/microsoft.png"> |
|
> |
|
<source :src="videoUrl" type="video/mp4" > |
|
</video> |
|
<i |
|
v-else-if="videoUrl == '' && videoFlag == false" |
|
class="el-icon-plus avatar-uploader-icon" |
|
>上传视频</i> |
|
<el-progress |
|
v-if="videoFlag == true" |
|
type="circle" |
|
:percentage="videoUploadPercent" |
|
style="margin-top: 30px" |
|
></el-progress> |
|
</el-upload> |
|
<P class="text">请保证视频格式正确,且不超过10M</P> |
|
<el-button @click="dialogVisible = false"> |
|
<!-- Cancel --> |
|
取消 |
|
</el-button> |
|
<el-button type="primary" @click="handleSubmit"> |
|
<!-- Confirm --> |
|
确认 |
|
</el-button> |
|
</el-dialog> |
|
</div> |
|
</template> |
|
|
|
<script> |
|
// import { getToken } from 'api/qiniu' |
|
import db from '@/utils/localstorage' |
|
export default { |
|
name: 'EditorSlideUpload', |
|
props: { |
|
color: { |
|
type: String, |
|
default: '#1890ff', |
|
}, |
|
}, |
|
data() { |
|
return { |
|
dialogVisible: false, |
|
listObj: {}, |
|
fileList: [], |
|
action: `${process.env.VUE_APP_DEV_REQUEST_DOMAIN_PREFIX}/file/upload`, |
|
list: [], |
|
headers: { |
|
Authorization: '', |
|
}, |
|
dataObj: { |
|
folderId: 1, |
|
}, |
|
videoUrl: '', |
|
videoUploadPercent: 0, |
|
videoFlag: false, |
|
} |
|
}, |
|
created() { |
|
this.headers.token = 'Bearer ' + db.get('TOKEN', '') |
|
this.headers.tenant = 'MDAwMA==' |
|
}, |
|
methods: { |
|
uploadClick() { |
|
this.dialogVisible = true |
|
this.videoUrl = '' |
|
}, |
|
handleVideoSuccess(response,fileList) { |
|
if(response.code == 0) { |
|
this.videoUrl = response.data.url |
|
this.videoFlag = false; |
|
}else{ |
|
this.$message.error('视频上传失败,请重新上传!'); |
|
} |
|
}, |
|
//验证视频格式和视频大小 |
|
beforeUploadVideo(file) { |
|
// const isLt10M = file.size / 1024 / 1024 < 10; |
|
if (['video/mp4', 'video/ogg', 'video/flv','video/avi','video/wmv','video/rmvb'].indexOf(file.type) == -1) { |
|
this.$message.error('请上传正确的视频格式'); |
|
return false; |
|
} |
|
// if (!isLt10M) { |
|
// this.$message.error('上传视频大小不能超过10MB哦!'); |
|
// return false; |
|
// } |
|
}, |
|
//上传进度条显示 |
|
uploadVideoProcess(event, file, fileList){ |
|
this.videoFlag = true; |
|
this.videoUploadPercent = Number(file.percentage.toFixed(0)); |
|
}, |
|
checkAllSuccess() { |
|
return Object.keys(this.listObj).every( |
|
(item) => this.listObj[item].hasSuccess |
|
) |
|
}, |
|
handleSubmit() { |
|
// const arr = Object.keys(this.listObj).map(v => this.listObj[v]) |
|
// if (!this.checkAllSuccess()) { |
|
// this.$message('Please wait for all images to be uploaded successfully. If there is a network problem, please refresh the page and upload again!') |
|
// return |
|
// } |
|
// if (!this.list.length) { |
|
// this.$message('请上传图片') |
|
// return |
|
// } |
|
let arr = this.list |
|
this.$emit('successCBK', arr,this.videoUrl) |
|
this.listObj = {} |
|
this.fileList = [] |
|
this.list = [] |
|
this.dialogVisible = false |
|
}, |
|
handleSuccess(response, file) { |
|
console.log(response,'response') |
|
if (response.data.dataType.code == 'IMAGE') { |
|
this.list.push(response.data.url) |
|
} |
|
if (response.data.dataType.code == 'VIDEO') { |
|
this.videoUrl = response.data.url |
|
} |
|
const uid = file.uid |
|
const objKeyArr = Object.keys(this.listObj) |
|
for (let i = 0, len = objKeyArr.length; i < len; i++) { |
|
if (this.listObj[objKeyArr[i]].uid === uid) { |
|
this.listObj[objKeyArr[i]].url = response.files.file |
|
this.listObj[objKeyArr[i]].hasSuccess = true |
|
return |
|
} |
|
} |
|
}, |
|
handleRemove(file) { |
|
const uid = file.uid |
|
const objKeyArr = Object.keys(this.listObj) |
|
for (let i = 0, len = objKeyArr.length; i < len; i++) { |
|
if (this.listObj[objKeyArr[i]].uid === uid) { |
|
delete this.listObj[objKeyArr[i]] |
|
return |
|
} |
|
} |
|
}, |
|
beforeUpload(file) { |
|
const _self = this |
|
const _URL = window.URL || window.webkitURL |
|
const fileName = file.uid |
|
this.listObj[fileName] = {} |
|
return new Promise((resolve, reject) => { |
|
const img = new Image() |
|
img.src = _URL.createObjectURL(file) |
|
img.onload = function () { |
|
_self.listObj[fileName] = { |
|
hasSuccess: false, |
|
uid: file.uid, |
|
width: this.width, |
|
height: this.height, |
|
} |
|
} |
|
resolve(true) |
|
}) |
|
}, |
|
}, |
|
} |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
.editor-slide-upload { |
|
margin-bottom: 20px; |
|
/deep/ .el-upload--picture-card { |
|
width: 100%; |
|
} |
|
} |
|
</style>
|
|
|