锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

vue完整上传图片(阿里云OSS)

时间:2022-11-16 17:30:00 荧光法溶解氧传感器oos61

1.布局简单(样式去除),图片浏览在左边,图片浏览在右边。input和一个span,当然span可自行设计,input它是隐藏的,点击外层div来触发它的onclick事件

    <!--这里展示大图-->     <div class="full_image" v-if="full_image">          <img :src="full_image" style="border-radius:3px">          <span style="position:absolute;right:10px;top:8px;font-size:16px;font-weight:400;cursor:pointer;user-select:none" @click="full_image=''">X</span>        </div>        <!--上传图片-->           <div >           <!--缩略图-->             <div  v-if="images">               <img :src="image.url" v-for="(image,index) in images" :key="index" @click="showImage" :data-url="image.url ''" style="cursor:pointer;">             </div>             <!--上传图片-->             <div  @click="uploadImage">               <div style="width:80px;height:80px">                 <input type="file" ref="image_input" accept=".png,.jpg,.jpeg" @change="imageSelect" hidden>                 <span>
       
        +
        <
        /span
        >
        <span
        >上传图片
        <
        /span
        >
        <span
        >
        (
        { 
         
        { 
         images
        .length
        }
        }
        /
        6
        )
        <
        /span
        > 
        <
        /div
        > 
        <
        /div
        > 
        <
        /div
        > 
        <button @click
        =
        "submit"
        >提交
        <
        /button
        > 
       

2.images是一个数组存放已选择的图片文件base64编码,full_image点击缩略图时将base64放进去以显示大图,files用户选择的文件都放进去,image_urls是上传后返回的url;注意base64编码是为了不上传图片到服务器也能在页面预览

// 这里使用阿里的oss上传图片,导入oss
import { 
         ossTempAuth } from '@/api/oss'
import OSS from 'ali-oss';
  data() { 
        
    return { 
        
      images: [], 
      full_image: '', // 当前放大图片base64码
      files: [], // 图片File实例
      image_urls: [], // 图片上传后返回url
    };
  },

3.这里是事件方法

// 点击图片div时触发input:click
    uploadImage() { 
        
      this.$refs.image_input.dispatchEvent(new MouseEvent('click'));
    },
    // 点击缩略图时展示图片
    showImage(event) { 
        
      this.full_image = event.target.dataset.url;
    },
    // uploadImage函数触发input的onclick事件,选择文件
    imageSelect(event) { 
        
      // 判定文件列表
      let file = event.target.files[0];
      for (let i = 0; i < this.images.length; i++)
        if (file.name == this.images[i].name) return;
      // 新建文件实例
      let ofReader = new FileReader();
      // 读取文件流
      ofReader.readAsDataURL(file);
      // 转为base64码
      ofReader.onload = evo => { 
        
        let base64 = evo.target.result;
        // 将图片base64码放进去数组,以便能够实时预览
        this.$set(this.images, this.images.length, { 
         name: file.name, url: base64 });
        this.files.push(file);
      }
    },

4.上传

//按钮点击
	submit(){ 
        
		this.uploadFiles();
	},
//准备上传
    async uploadFiles() { 
        
      var self = this;
      // 获取已经选择的文件流
      var files = this.files;
      var video = this.video_file;
      // 获取秘钥信息
      let authConfig = await ossTempAuth();
      let back = authConfig.data;
      // 实例化OSS
      const client = await new OSS({ 
        
        region: back.region,
        accessKeyId: back.AccessKeyId,
        accessKeySecret: back.AccessKeySecret,
        bucket: back.bucket,
        stsToken: back.SecurityToken,
      });
      // 上传图片
      async function uploadImage() { 
        
        try { 
        
          for (let i = 0; i < files.length; i++) { 
        
            let name = files[i].name;
            let index = name.lastIndexOf(".");
            let ext = name.substr(index + 1);
            const result = await client.put(
              'hummingbird_v2/returns/pic/' + new Date().getTime() + self.uuid(10, 16) + i + '.' + ext,
              files[i],
              { 
        
        		'Content-Encoding': 'UTF-8',
        		'Expires': 'Wed, 08 Jul 2030 16:57:01 GMT',
      			}
            );
            self.image_urls[i] = result.url;
          }
        } catch (e) { 
        
          this.model_upload = false;
          console.log("上传图片失败", e);
        }
      }
      // 调用上传
      if (files.length > 0) uploadImage();
    },
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章