封装图片上传

1

<template>
  <el-upload class="logo-uploader"
    v-model="state.imageUrl"
    action=""
    :accept="`image/${accept}`"
    :show-file-list="false"
    :before-upload="beforeAvatarUpload"
  >
    <img :src="state.imageUrl" class='avatar-logo' v-if="state.imageUrl" />
    <div class='icon-uploader' v-else>
      <i class='el-icon-plus avatar-uploader-icon'/>
    </div>
  </el-upload>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
import { uploadToCDN } from '@/apis/coupon'

@Component
export default class Empty extends Vue {
  @Prop({ default: 'png' })
  accept!: string // 上传图片类型

  @Prop({ default: 2 })
  maxSize!: number // 上传图片限制大小

  @Prop({ default: 500 })
  imgWidthSize!: number // 上传图片宽度限制

  @Prop({ default: 500 })
  imgHeightSize!: number // 上传图片高度限制

  state = {
    imageUrl: ''
  }

  async beforeAvatarUpload(file: any) {
    const type = file.type === `image/${this.accept}`
    if (!type) {
      this.$message.error(`图片格式错误!请上传${this.accept.toUpperCase()}格式的图片!`)
      return false
    }

    const isLt2M = file.size / 1024 / 1024 < this.maxSize
    if (!isLt2M) {
      this.$message.error(`上传图片大小不能超过 ${this.maxSize}MB!`)
      return false
    }

    const isSize = await new Promise((resolve, reject) => {
      const _URL = window.URL || window.webkitURL
      const img = new Image()
      img.onload = () => {
        if (img.width === this.imgWidthSize && img.height === this.imgHeightSize) {
          resolve(true)
        } else {
          this.$message.error(`上传图片尺寸必须 ${this.imgWidthSize}px * ${this.imgHeightSize}px`)
          reject()
        }
      }
      img.src = _URL.createObjectURL(file)
    })

    if (type && isLt2M && isSize) {
      const res = await uploadToCDN(file)
      if (res.isValid()) {
        this.state.imageUrl = (res.data as any).url
        this.$emit('handleAvatarSuccess', this.state.imageUrl)
      } else {
        this.$message.error('图片上传失败')
      }
    }

    return Promise.reject()
  }
}
</script>

2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arco Design Vue提供了一个名为`ArcoUpload`的组件来封装图片上传的功能。以下是使用步骤: 1. 安装Arco Design Vue ```bash npm install @arco-design/web-vue ``` 2. 引入ArcoUpload组件 ```js import { ArcoUpload } from '@arco-design/web-vue'; ``` 3. 在模板中使用ArcoUpload组件 ```html <template> <arco-upload action="/api/upload" :before-upload="handleBeforeUpload" :on-success="handleSuccess" :on-error="handleError" :on-remove="handleRemove" :max-file-count="3" :max-file-size="5 * 1024 * 1024" :file-list.sync="fileList" multiple drag accept="image/*" > <template #trigger> <arco-button>上传图片</arco-button> </template> </arco-upload> </template> ``` 4. 设置ArcoUpload组件的属性和事件处理函数 - `action`:上传图片的接口地址 - `before-upload`:上传图片前的校验函数,返回false则取消上传 - `on-success`:上传成功的回调函数 - `on-error`:上传失败的回调函数 - `on-remove`:删除已上传图片的回调函数 - `max-file-count`:最大上传图片数量 - `max-file-size`:最大上传图片大小 - `file-list.sync`:已上传图片列表,需要使用`.sync`修饰符实现双向绑定 - `multiple`:是否支持多选 - `drag`:是否支持拖拽上传 - `accept`:限制上传文件类型 5. 处理上传相关的函数 ```js export default { data() { return { fileList: [], }; }, methods: { handleBeforeUpload(file) { console.log('before upload:', file); return true; }, handleSuccess(response, file) { console.log('upload success:', response, file); }, handleError(error, file) { console.log('upload error:', error, file); }, handleRemove(file) { console.log('remove file:', file); }, }, }; ``` 以上就是使用Arco Design Vue封装图片上传的步骤和代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值