多媒体信息发布平台
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.
 
 
 

161 lines
5.2 KiB

<template>
<div id="mef-m-authentication-apply">
<div class="apply-upload-item fr noMb">
<div class="photo-upload item-03" :class="{uploaded: userWorkPhoto}" @click="photoUpload('userWorkPhoto')">
<img :src="userWorkPhoto" onerror="this.src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII='" class="fit-cover-img" />
<span v-if="userWorkPhoto" class="delete-icon" @click.stop="clearPhotoUrl('userWorkPhoto')"></span>
</div>
</div>
</div>
</template>
<script>
/* function getQiniuToken() {
return Promise.resolve({'uptoken': 'xxx'});
} */
// c39eAF6CRLXTPcOp7YZWN47QG-R8GMdJwBtBQ1Eb:vQEKW6kSJvaMFOD6G0Fj1toohjE=:eyJzY29wZSI6ImFpeXVleGluZzoiLCJkZWFkbGluZSI6MTY0NzU3NjY4N30=
/* c39eAF6CRLXTPcOp7YZWN47QG-R8GMdJwBtBQ1Eb:MZKUih1U9m0jKz57RwADJw02a9U=:eyJwZXJzaXN0ZW50UGlwZWxpbmUiOiJhaXl4bGliX3ZpZGVvLXBpcGUiLCJzY29wZSI6ImFpeXVleGluZyIsInBlcnNpc3RlbnRPcHMiOiJhdnRodW1iL20zdTgvbm9Eb21haW4vMS9zZWd0aW1lLzE1L3ZiLzQ0MGsvaGxzS2V5L2Z0em4xOWFpeXhsaWIyMDEvaGxzS2V5VXJsL2h0dHBzOi8vcWluaXUuYWl5eGxpYi5jb20vYWl4eWxpYndvcmQua2V5fHNhdmVhcy8iLCJkZWFkbGluZSI6MTY0NzU3NjcxOX0=*/
import { getQiniuToken } from '@/api/material/material'
export default {
name: 'Upload',
data() {
return {
userWorkPhoto: ''
}
},
mounted() {
},
methods: {
clearPhotoUrl(urlName) {
this[urlName] = ''
},
photoUpload(type) {
const ipt = document.createElement('input')
ipt.setAttribute('type', 'file')
ipt.setAttribute('accept', 'image/*')
ipt.style.width = 0
ipt.style.height = 0
ipt.addEventListener('change', async() => {
const [file] = ipt.files
const base64Img = await this.fileToBase64(file)
const url = await this.uploadBase64(base64Img)
this.userWorkPhoto = url
document.body.removeChild(ipt)
})
document.body.appendChild(ipt)
ipt.click()
},
uploadBase64(base64Img) {
return new Promise((resolve) => {
getQiniuToken()
.then(res => {
const key = 'qiniu.aiyxlib.com' + this.uuid() + '.jpg'
const pic = base64Img.split(',')[1]
// const url = 'https://upload.qiniup.com/' + window.btoa(key) // 非华东空间需要根据注意事项 1 修改上传域名
const url = 'https://upload.qiniup.com/' // 非华东空间需要根据注意事项 1 修改上传域名
const xhr = new XMLHttpRequest()
xhr.onreadystatechange = () => {
if (xhr.readyState == 4) {
resolve(
'qiniu.aiyxlib.com' + JSON.parse(xhr.responseText).key
)
}
}
xhr.open('POST', url, true)
xhr.setRequestHeader('Content-Type', 'application/octet-stream')
xhr.setRequestHeader('Authorization', 'UpToken ' + res.data)
xhr.send(pic)
// 获取到凭证之后再将文件上传到七牛云空间
})
.catch(console.error)
})
},
fileToBase64(file) {
return new Promise((resolve) => {
const reader = new FileReader()
// 传入一个参数对象即可得到基于该参数对象的文本内容
reader.readAsDataURL(file)
reader.onload = function(e) {
// target.result 该属性表示目标对象的DataURL
resolve(e.target.result)
}
})
},
uuid(len, radix) {
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
const uuid = []
let i
radix = radix || chars.length
if (len) {
for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
} else {
let r
uuid[8] = uuid[13] = uuid[18] = uuid[23] = ''
uuid[14] = '4'
for (i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | Math.random() * 16
uuid[i] = chars[i == 19 ? r & 0x3 | 0x8 : r]
}
}
}
return uuid.join('')
}
}
}
</script>
<style lang="scss" scoped>
#mef-m-authentication-apply{
.apply-upload-item{
width: 132px;
margin-bottom: 30px;
text-align: center;
&.noMb{
margin-bottom: 0;
}
.photo-upload {
width: 132px;
height: 96px;
position: relative;
margin-bottom: 10px;
&.item-03{
// background: top / 100% url(~@/assets/images/authentication/upload_workCard.png)
// no-repeat;
}
&.uploaded{
background: none;
}
img{
width: 85px;
height: 85px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
.delete-icon{
width: 16px;
height: 16px;
// background: top / 100% url(~@/assets/images/common/icon-del.png)
// no-repeat;
border-radius: 0;
top: -8px;
right: -8px;
position: absolute;
i {
display: none;
}
}
}
.apply-name{
font-size: 14px;
font-weight: bold;
padding-top: 10px;
text-align: center;
}
}
}
</style>