zoukankan      html  css  js  c++  java
  • 上传图片到阿里云

    要根据后台返回的是不是这种形式的数据 以及后台的传参需求。否则可能上传不成功

    在components中新建一个组件 upload.vue

    upload.vue组件中

    <template>
      <el-upload
        v-loading="loading"
        :class="className"
        :http-request="Upload"
        action=""
        :show-file-list="showFileList"
        :before-upload="beforeUpload"
      >
        <slot />
      </el-upload>
    </template>
    
    <script>
    //import { saBs } from '@/utils/request'
    import axios from 'axios'
    import { getUploadToken } from '@/api/svrmanage/apply'
    export default {
      props: {
        className: String,
        imgWidth: String,
        imgHeight: String,
        showFileList: {
          type: Boolean,
          default: false
        }
      },
      data() {
        return {
          pictureList: [],
          loading: false
        }
      },
      watch: {
        fileList() {
          // this.pictureList = this.fileList
        }
      },
      created() {
        // this.pictureList = this.fileList
      },
      methods: {
        Upload(file) {
          const _this = this
          this.loading = true
          // 获取Img服务器信息
          // 要根据你们后台的返回数据进行拼接 以下是我项目中的
          //后台接口getUploadToken() 接口返回数据  图片展示进行 host + '/' + fileName
            //accessid: "LTAIDQhPlHf4UQLs"
            //dir: "merchant/gl_24_ads/"
            //expire: "1586504494"
            //host: "https://gl365dev.oss-cn-shenzhen.aliyuncs.com"
            //policy: "eyJleHBpcmF0aW9uIjoiMjAyMC0wNC0xMFQwNzo0MTozNC41MjVaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwMF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCJtZXJjaGFudC9nbF8yNF9hZHMvIl1dfQ=="
            //signature: "UdJ1I2ZsnvgNq9KcOszAUg69xE0="
         getUploadToken().then(res => {
            // const Data = JSON.stringify(res.opd)
            // localStorage.setItem('imgData', Data)
            const data = res.opd
            const date = new Date()
            var request = new FormData()
            const host = data.host
            // append相当于打开阿里云通道  这个相当于是你要上传时的通道数据
            const fileName = data.dir + data.expire + '.png'
            request.append('OSSAccessKeyId', data.accessid)// Bucket 拥有者的Access Key Id。
            request.append('policy', data.policy)// policy规定了请求的表单域的合法性
            request.append('Signature', data.signature)// 根据Access Key Secret和policy计算的签名信息,OSS验证该签名信息从而验证该Post请求的合法性
            request.append('key', fileName)// 文件名字,可设置路径
            request.append('success_action_status', '200')// 让服务端返回200,不然,默认会返回204
            request.append('file', file.file)// 需要上传的文件 file
            axios({
              method: 'post',
              url: data.host,
              data: request
            }).then(res => {
              return res.data
            }).then(rst => {
              _this.loading = false
              _this.$emit('handle-success', host + '/' +fileName)
              _this.$emit('on-preview', host + '/' +fileName)
            }).catch(() => {
              _this.loading = false
            })
          }).catch(res => {
            console.log('res>>>>>>>', res)
          })
        },
        beforeUpload(file) {
          const _this = this
          var testmsg = file.name.substring(file.name.lastIndexOf('.') + 1)
          const img = new Image()
          img.src = file
          const extension = testmsg.toLocaleLowerCase() === 'jpg'
          const extension2 = testmsg.toLocaleLowerCase() === 'png'
          const extension3 = testmsg.toLocaleLowerCase() === 'gif'
          let isSize
          const isLt2M = file.size / 1024 / 1024 < 10
          if (this.imgWidth && this.imgHeight) {
            isSize = new Promise(function(resolve, reject) {
              const _URL = window.URL || window.webkitURL
              const img = new Image()
              img.onload = function() {
                const valid = img.width == _this.imgWidth && img.height == _this.imgHeight
                valid ? resolve() : reject()
              }
              img.src = _URL.createObjectURL(file)
            }).then(() => {
              return file
            }, () => {
              this.$message.error(`上传的图片必须是等于${_this.imgWidth} * ${_this.imgHeight}!`)
              return Promise.reject()
            })
          }
          if (!extension && !extension2) {
            this.$message({
              message: '上传文件只能是 jpg、png、gif格式!',
              type: 'warning'
            })
          }
          if (!isLt2M) {
            this.$message({
              message: '上传文件大小不能超过 10MB!',
              type: 'warning'
            })
          }
          return (extension || extension2 || extension3) && isLt2M && isSize
        }
      }
    }
    </script>
    
    <style>
    
    </style>

    然后引用组件进行使用

    index.vue 上传图片

    <template>
      <div class="app-container svrmanage">
          <upload class-name="avatar-uploader" @handle-success="handleAvatarSuccess">
            <img v-if="applyUrl" :src="applyUrl" class="avatar">
            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
          </upload>
          <div slot="footer">
            <el-button @click="SubmitFlowwater">提交申请</el-button>
          </div>
      </div>
    </template>
    
    <script>
    import Upload from '@/components/upload'
    export default {
      components: {
        Upload
      },
      data() {
        return {
          applyUrl: '',
        };
      },
      created() {},
      methods: {
        handleAvatarSuccess(file) {
          this.applyUrl =  file
        },
        // 修改流水等级
        SubmitFlowwater() {
          // 请求接口 this.applyUrl 就是传给后台的url参数
        }
      }
    };
    </script>
  • 相关阅读:
    根据时间段查询数据并按照降序排列
    Json数组(以[ ] 中括号开头)字符串转为json对象
    Java 后台请求第三方系统接口详解
    Map 集合 和 String 字符串相互转换工具类
    并发工具类——CountDownLatch、CyclicBarrier、Semaphore与Exchanger
    AQS相关
    Atomic原子类
    CAS相关
    synchronized关键字相关
    谈谈对volatile关键字的理解
  • 原文地址:https://www.cnblogs.com/toughy/p/12673819.html
Copyright © 2011-2022 走看看