图片上传-阿里云oss

<template>
  <div>
    <!-- <button>选择图片上传</button>  multiple 多选 accept:接受图片格式-->
    <label for="upload" class="choose-img" :class="{upLoading: isUploading}">选择图片上传</label>
    <input type="file" multiple id="upload"
    style="display:none" accept="image/*"
    @change="onchange" ref="file" :disabled="isUploading"
    >
    <p class="tip">一次可以选择多张图片,最多不超过9张(单张图片大小 1M)</p>
    <ul class="img-container">
      <li v-for="(item, index) in imgList" :key="index"
      :style="{background: `url(${item}) no-repeat center/contain`}"
      ></li>
    </ul>
  </div>
</template>

<script>
import OSS from 'ali-oss'
const ACCESSKEY = {
  ID: 'LTAI4G7RB4oTBHCYu6JEofaP',
  SECRET: 'TSofNQ020pScmNpL3zMuAoR4mbd7Le'
}
export default {
  data () {
    return {
      client: new OSS({
        region: 'oss-cn-beijing',
        bucket: 'imooc-es-vue-er',
        accessKeyId: ACCESSKEY.ID,
        accessKeySecret: ACCESSKEY.SECRET
      }),
      imgList: [], // 存放上传完成的图片的列表
      isUploading: false // 表示图片是否正在上传
    }
  },
  methods: {
    onchange () {
      // 获得dom结构 <input data-v-0ecd383b="" type="file" multiple="multiple" id="upload" accept="image/*" style="display: none;">
      // const inputDOM = this.$refs.file
      // console.log(this.$refs.file.files) 输出选择的dom
      // 可选链 多层dom结构
      const newFiles = this.$refs?.file?.files
      // 判断选择个数
      if (newFiles.length > 9) {
        alert('最多可以一次性选择九张图片')
        return false
      }
      const files = []
      // 验证图片大小是否大于1M (size)
      for (const file of newFiles) {
        // 把单位转化为M
        const size = file.size / 1024 / 1024
        if (size > 1) {
          alert('请选择1M的图片')
          return false
        }
        files.push(file)
      }
      this.uploadFilesByOSS2(files)
    },
    // 上传多图到阿里云oss
    uploadFilesByOSS (files) {
      this.isUploading = true
      const uploadRequest = []
      for (const file of files) {
        uploadRequest.push(
          new Promise((resolve, reject) => {
          // 上传文件的名称,上传文件本身
            this.client.put(`${Math.random()}-${file.name}`, file).then(res => {
              console.log(res)
              // 取到之前imgList的项 在和每次返回的url地址拼接成一个数组
              // 不能保证顺序
              // this.imgList = [...this.imgList, res.url]
              resolve(res.url)
            }).catch(err => {
              console.log(err)
              reject(err)
            })
          })
        )
      }
      // all 缺陷-》有一张上传失败了之后 会直接进入catch
      // Promise.all 全部上传之后的操作
      // allSettled 弥补了all的缺陷
      Promise.allSettled(uploadRequest).then(res => {
        console.log(res)
        const imgs = []
        // for of对于数组遍历的方法
        for (const item of res) {
          if (item.status === 'fulfilled') {
            imgs.push(item.value)
          }
        }
        // 图片可以直接按顺序执行
        this.imgList = imgs
        this.isUploading = false
      }).catch(err => {
        console.log(err)
      })
    },
    // 优化的方法 uploadFilesByOSS2
    // async / await
    async uploadFilesByOSS2 (files) {
      this.isUploading = true // 正在上传
      const imgs = []
      for (const file of files) {
        const result = await this.client.put(`${Math.random()}-${file.name}`, file)
        imgs.push(result.url)
      }
      this.imgList = imgs
      this.isUploading = false // 上传完成
    }
  }
}
</script>

<style scoped>
.choose-img{
  display: block;
  width: 150px;
  height: 50px;
  text-align: center;
  line-height: 50px;
  background-color: rgb(43, 216, 115);
  color: #fff;
  cursor: pointer;
  border-radius: 5px;
}

.img-container > li{
    list-style: none;
    width: 150px;
    height: 100px;
    float: left;
    margin: 0 30px 30px 0;
    border: 1px solid #ccc;
}

.upLoading{
    background-color: #ccc;
    cursor: Default;
}
</style>

上一篇:oss上传封装及使用


下一篇:云盘上使用aws_s3_sdk for php