forked from mt-fe-group/mt-yd-ui
214 lines
5.2 KiB
Vue
214 lines
5.2 KiB
Vue
<template>
|
||
<div class="base-upload" style="border-radius: 8px; margin-top: 48px; padding: 0; max-height: 500px;">
|
||
<el-upload
|
||
class="yd-upload"
|
||
action="#"
|
||
:http-request="handleUpload"
|
||
multiple
|
||
:file-list="fileList"
|
||
:on-preview="handleDownload"
|
||
:on-remove="handleRemove"
|
||
:before-upload="/.*?image.*?/i.test(extraParams.typeCode) ? validateImage : validateFile"
|
||
>
|
||
<!-- :before-remove="beforeRemove" -->
|
||
<!-- accept="image/*" -->
|
||
<!-- <el-upload class="yd-upload" :action="$http.adornUrl(url)" multiple name="files" :data="extraParams" :file-list="fileList" :on-remove="handleRemove" :before-remove="beforeRemove"> -->
|
||
<el-button :disabled="readOnly" type="primary">{{ buttonContent }}</el-button>
|
||
<div v-if="tip" slot="tip" class="el-upload__tip">{{ tip }}</div>
|
||
</el-upload>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import { pick } from 'lodash/object'
|
||
|
||
export default {
|
||
name: 'BaseUpload',
|
||
props: {
|
||
url: String,
|
||
buttonContent: String,
|
||
tip: {
|
||
type: String,
|
||
default: null
|
||
},
|
||
extraParams: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
uploaderInjectFileList: {
|
||
// 从外部传进来 fileList,用于展示文件列表用
|
||
type: Array,
|
||
default: () => []
|
||
},
|
||
readOnly: {
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
},
|
||
// inject: {
|
||
// parentDataForm: "_df"
|
||
// },
|
||
data() {
|
||
return {
|
||
fileList: []
|
||
}
|
||
},
|
||
mounted() {
|
||
this.fileList.splice(0)
|
||
|
||
this.$watch('uploaderInjectFileList', function(val) {
|
||
if (val && val.length) {
|
||
console.log('this.uploaderInjectFileList', this.uploaderInjectFileList)
|
||
/** uploaderInjectFileList 里关于文件的信息比较全,需要手动过滤一下 */
|
||
this.fileList = val.map(item => {
|
||
const name = item.fileUrl.split('/').pop()
|
||
return { ...pick(item, ['id', 'fileName', 'typeCode']), name }
|
||
})
|
||
}
|
||
console.log('fillist: ', this.fileList)
|
||
})
|
||
|
||
// if (this.parentDataForm) {
|
||
// console.log('parent dataform: ', this.parentDataForm)
|
||
// }
|
||
},
|
||
methods: {
|
||
/** 自定义上传行为 */
|
||
handleUpload(file) {
|
||
const formData = new FormData()
|
||
let files = file.file
|
||
formData.append('files', files)
|
||
|
||
this.$http({
|
||
url: this.$http.adornUrl(this.url),
|
||
method: 'POST',
|
||
data: formData,
|
||
params: {
|
||
typeCode: this.extraParams.typeCode
|
||
}
|
||
}).then(({ data: res }) => {
|
||
if (res && res.code === 0) {
|
||
res.data.forEach(item => {
|
||
const ext = item.fileUrl.split('.').reverse()[0]
|
||
const name = `${item.fileName}.${ext}`
|
||
this.fileList.push({ ...pick(item, ['id', 'fileName', 'typeCode']), name })
|
||
})
|
||
// TODO: 在新增和更新阶段,带入 fileIds[] 数组给后端,就可完成文件和设备类型的绑定、删除操作
|
||
this.$emit('uploader-update-filelist', this.fileList)
|
||
}
|
||
})
|
||
},
|
||
|
||
/** 大小验证,由配置文件开启 */
|
||
validateFile(file) {
|
||
const isRightSize = file.size / 1024 / 1024 < 2
|
||
if (!isRightSize) {
|
||
// this.$message.error(this.$t('upload.picSizeAlarm'))
|
||
this.$message.error('文件不应超过 2MB')
|
||
}
|
||
return isRightSize
|
||
},
|
||
|
||
/** 图片验证,由配置文件开启 */
|
||
validateImage(file) {
|
||
console.log('[*] 验证图片')
|
||
|
||
const isRightSize = file.size / 1024 / 1024 < 2
|
||
if (!isRightSize) {
|
||
this.$message.error('文件不应超过 2MB')
|
||
// this.$message.error(this.$t('upload.picSizeAlarm'))
|
||
}
|
||
|
||
const isAccept = new RegExp('image/*').test(file.type)
|
||
if (!isAccept) {
|
||
// this.$message.error(this.$t('upload.picAlarm'))
|
||
this.$message.error('只允许上传图片')
|
||
}
|
||
return isRightSize && isAccept
|
||
},
|
||
|
||
/** 点击下载 */
|
||
handleDownload({ id: fileId, name: fileName }) {
|
||
const type = {
|
||
download: 1,
|
||
preview: 0
|
||
}
|
||
this.$http({
|
||
url: this.$http.adornUrl('/monitoring/attachment/downloadFile'),
|
||
method: 'get',
|
||
params: this.$http.adornParams({
|
||
attachmentId: fileId,
|
||
type: type.download
|
||
// fileName,
|
||
// outputQuality,
|
||
// scale
|
||
}),
|
||
responseType: 'blob'
|
||
}).then(({ data: res }) => {
|
||
const blob = new Blob([res])
|
||
console.log('blob', blob)
|
||
if ('download' in document.createElement('a')) {
|
||
const alink = document.createElement('a')
|
||
console.log('filename: ', fileName)
|
||
alink.download = fileName
|
||
alink.style.display = 'none'
|
||
alink.target = '_blank'
|
||
alink.href = URL.createObjectURL(blob)
|
||
document.body.appendChild(alink)
|
||
alink.click()
|
||
URL.revokeObjectURL(alink.href)
|
||
document.body.removeChild(alink)
|
||
} else {
|
||
navigator.msSaveBlob(blob, fileName)
|
||
}
|
||
})
|
||
},
|
||
|
||
// beforeRemove(file, filelist) {
|
||
// return this.$confirm(`确定移除 ${file.name}?`)
|
||
// },
|
||
|
||
handleRemove(file, filelist) {
|
||
// 把更新后的 fileList 传递出去
|
||
this.$emit('uploader-update-filelist', filelist)
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
.base-upload >>> .yd-upload {
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
/* .base-upload >>> .el-button {
|
||
display: block;
|
||
width: 200px;
|
||
position: relative;
|
||
left: -50px;
|
||
} */
|
||
|
||
/* .base-upload >>> .el-upload--text {
|
||
width: 100px;
|
||
position: relative;
|
||
left: -100px;
|
||
} */
|
||
|
||
.base-upload >>> .el-upload__tip {
|
||
margin-top: 0;
|
||
margin-left: 5px;
|
||
}
|
||
|
||
.base-upload {
|
||
display: flex;
|
||
}
|
||
|
||
.yd-upload {
|
||
/* background-color: #efefef; */
|
||
flex-grow: 1;
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: flex-start;
|
||
}
|
||
</style>
|