123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- import { ElImage, ElLoading, ElMessage, ElUpload } from 'element-plus'
- import { defineComponent } from 'vue'
- import styles from './index.module.less'
- import iconUpload from './images/icon_upload.png'
- import request from '@/helpers/request'
- export default defineComponent({
- name: 'col-upload',
- props: {
- modelValue: {
- type: String,
- default: ''
- },
- disabled: {
- type: Boolean,
- default: false
- },
- bucket: {
- type: String,
- default: 'daya'
- },
- size: {
- type: Number,
- default: 5 // 默认5M
- },
- accept: {
- type: String,
- default: 'images/*'
- },
- tips: {
- type: String,
- default: '请上传图片'
- },
- extraTips: {
- type: String,
- default: '图片最大不能超过5MB'
- }
- },
- data() {
- return {
- ossUploadUrl: 'https://ks3-cn-beijing.ksyuncs.com/' + this.bucket,
- dataObj: {
- policy: '',
- signature: '',
- key: '',
- KSSAccessKeyId: '',
- acl: 'public-read',
- name: ''
- },
- fileList: [] as any,
- loading: null as any
- }
- },
- methods: {
- handleSuccess() {
- this.loading?.close()
- let url = this.ossUploadUrl + '/' + this.dataObj.key
- console.log(url)
- this.$emit('update:modelValue', url)
- },
- handleRemove() {
- console.log('remove')
- },
- handleChange() {
- console.log('handleChange')
- },
- handleProgress() {
- console.log('handleProgress')
- },
- handleError() {
- this.loading?.close()
- },
- async beforeUpload(file: any) {
- // beforeUpload
- console.log(file)
- // let fileType = true
- // if (props.rules.type && props.rules.type.length > 0) {
- // const fileExtension = file.name.split('.').pop().toUpperCase()
- // console.log(
- // props.rules.type,
- // fileExtension,
- // props.rules.type.indexOf(fileExtension) != -1
- // )
- // if (props.rules.type.indexOf(fileExtension) != -1) {
- // fileType = true
- // } else {
- // fileType = false
- // ElMessage.error('请上传正确的文件!')
- // return false
- // }
- // }
- let isLt2M = true
- if (this.size) {
- isLt2M = file.size / 1024 / 1024 < this.size
- if (!isLt2M) {
- ElMessage.error(`文件大小不能超过${this.size}M!`)
- return false
- }
- }
- this.loading = ElLoading.service({
- target: this.$refs.uploadDom as HTMLElement,
- lock: true,
- fullscreen: false,
- text: '上传中...',
- background: 'rgba(0, 0, 0, 0.7)'
- })
- console.log(this.loading)
- try {
- let fileName = file.name.replaceAll(' ', '_')
- let key = new Date().getTime() + fileName
- let obj = {
- filename: fileName,
- bucketName: this.bucket,
- postData: {
- filename: fileName,
- acl: 'public-read',
- key: key,
- unknowValueField: []
- }
- }
- const { data } = await request.post('/api-website/getUploadSign', {
- data: obj
- })
- this.dataObj = {
- policy: data.policy,
- signature: data.signature,
- key: key,
- KSSAccessKeyId: data.kssAccessKeyId,
- acl: 'public-read',
- name: fileName
- }
- } catch (e) {
- this.loading.close()
- }
- },
- handleExceed() {}
- },
- render() {
- return (
- <div class={styles.colUpload}>
- <ElUpload
- disabled={this.disabled}
- action={this.ossUploadUrl}
- data={this.dataObj}
- onSuccess={this.handleSuccess}
- onRemove={this.handleRemove}
- onChange={this.handleChange}
- onProgress={this.handleProgress}
- onError={this.handleError}
- fileList={this.fileList}
- showFileList={false}
- accept={this.accept}
- beforeUpload={this.beforeUpload}
- onExceed={this.handleExceed}
- ref="uploadRef"
- >
- <div
- // id="uploadDom"
- ref="uploadDom"
- class={styles.uploadClass}
- style={{ height: '106px' }}
- >
- {this.modelValue ? (
- <ElImage
- src={this.modelValue}
- fit="cover"
- class={styles.uploadSection}
- />
- ) : (
- <div
- class={[
- styles.uploadSection,
- 'flex items-center flex-col justify-center'
- ]}
- >
- <img src={iconUpload} class="w-8 h-7 mb-3" />
- <p>{this.tips}</p>
- </div>
- )}
- </div>
- </ElUpload>
- <p class="text-3 text-[#999999] leading-6 pt-1">{this.extraTips}</p>
- </div>
- )
- }
- })
|