Vue预览上传图片

1、转化为base64的字符串

<template>
  <el-card class="box-card">
    <div>
      <img :src="avatar" alt="" class="preview" v-if="avatar" />
      <!-- 图片,用来展示用户选择的头像 -->
      <img
        src="../../../assets/images/avatar.jpg"
        alt=""
        class="preview"
        v-else
      />

      <!-- 按钮区域 -->
      <div class="btn-box">
        <!-- 增加文件选择框 -->
        <input
          type="file"
          accept="image/*"
          style="display: none"
          ref="iptFile"
          @change="onChangeFile"
        />
        <el-button
          type="primary"
          icon="el-icon-plus"
          @click="$refs.iptFile.click()"
          >选择图片</el-button
        >
      </div>
    </div>
  </el-card>
</template>

<script>
export default {
  name: "UserAvatar",
  data() {
    return {
      avatar: "",
    };
  },
  methods: {
    // 获取图片
    onChangeFile(e) {
      const fileList = e.target.files;
      if (fileList.length > 0) {
        // 选择了图片
        console.log(fileList[0]);
        // 将图片转化为base64的字符串  FileReader
        const reader = new FileReader();
        // readAsDataURL将文件对象的数据读取到reader中,转化为base64的字符串
        reader.readAsDataURL(fileList[0]);
        // load监听读取完成  reader.result
        reader.addEventListener("load", () => {
          console.log(reader.result);
          this.avatar = reader.result;
        });
      } else {
        // 没有选中图片
        this.avatar = "";
      }
    },
  },
};
</script>

<style lang="less" scoped>
.btn-box {
  margin-top: 10px;
}
.preview {
  object-fit: cover;
  width: 350px;
  height: 350px;
}
</style>

2、转换成 url

<template>
  <div>
    <!-- 用来显示封面的图片 -->
    <img :src="previewImg" alt="" class="cover-img" ref="imgRef" />
    <br />
    <!-- 文件选择框,默认被隐藏 -->
    <input @change="coverImgChangeHandler" type="file"  accept="image/*" ref="iptFileRef" hidden/>
    <!-- 选择封面的按钮 -->
    <button type="text" @click="choosecoverImgHandler">+ 选择封面</button>
  </div>
</template>
 
<script>
// 导入默认图片, webpack 就会进行打包
// vue-cli 集成webpack  使用import from 导入一个图片时
// 会判断图片的大小,如果小于8kb,直接转化为base64的字符串 import 后面是一个字符串
// 如果大于8kb,会生成一个单独的文件,import后面 返回是一个文件的路径
import coverImg from '@/assets/images/cover.jpg'
export default {
  data () {
    return {
      // 把默认图片赋值给封面图片显示
      previewImg: coverImg
    }
  },
  methods: {
    // 点击选择封面,触发图片选择框的点击事件
    choosecoverImgHandler () {
      this.$refs.iptFileRef.click()
    },
    // 图片选择框的 change 事件触发
    coverImgChangeHandler (e) {
      console.log(e.target.files)
      // 获取用户选择的文件对象
      const files = e.target.files
      // 判断用户是否选择了文件对象
      if (files.length === 0) {
        // 用户没有选择图片(使用默认图片)
        this.previewImg = coverImg
      } else {
        // 用户选择了图片(使用选择的图片)
        // 将 File 对象转成 url
        // URL.createObjectUR 能够将图片对象 存储到程序的内存中,返回一个地址
        this.previewImg = URL.createObjectURL(files[0])
      }
    }
  }
}
</script>
 
<style lang="less" scoped>
// 设置图片封面的宽高
.cover-img {
  width: 400px;
  height: 280px;
  object-fit: cover;
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值