继续创造,加快生长!这是我参与「日新方案 10 月更文应战」的第22天,点击查看活动详情

1.运用element-ui中的el-upload

这是element-ui自带的上传文件组件,能够经过经过点击或者拖拽上传文件

官网链接

这儿我需求的是头像上传预览,所以我挑选用户头像上传的el-upload代码

<el-upload
  class="avatar-uploader"
  action="https://jsonplaceholder.typicode.com/posts/"
  :show-file-list="false"
  :on-success="handleAvatarSuccess"
  :before-upload="beforeAvatarUpload">
  <img v-if="imageUrl" :src="imageUrl" class="avatar">
  <i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>

怎么完结图片上传预览?教你图片上传组件的封装(el-upload)

2.封装组件

新建组件src/components/UploadImg/index.vue

  • 这儿限制上传的图片一定为jpg格局:

const isJPG = file.type === ‘image/jpeg’;

  • 限制图片大小小于2MB

const isLt2M = file.size / 1024 / 1024 < 2;

  • URL.createObjectURL()能够把二进制文件转为一个Blob目标,然后img的src能够把blob地址解析显示图片

this.imageUrl = URL.createObjectURL(file.raw);

<el-upload
  class="avatar-uploader"
  action="https://jsonplaceholder.typicode.com/posts/"
  :show-file-list="false"
  :on-success="handleAvatarSuccess"
  :before-upload="beforeAvatarUpload">
  <img v-if="imageUrl" :src="imageUrl" class="avatar">
  <i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
<style>
  .avatar-uploader .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
  }
  .avatar-uploader .el-upload:hover {
    border-color: #409EFF;
  }
  .avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
  }
  .avatar {
    width: 178px;
    height: 178px;
    display: block;
  }
</style>
<script>
  export default {
    data() {
      return {
        imageUrl: ''
      };
    },
    methods: {
      handleAvatarSuccess(res, file) {
        this.imageUrl = URL.createObjectURL(file.raw);
      },
      beforeAvatarUpload(file) {
        const isJPG = file.type === 'image/jpeg';
        const isLt2M = file.size / 1024 / 1024 < 2;
        if (!isJPG) {
          this.$message.error('上传头像图片只能是 JPG 格局!');
        }
        if (!isLt2M) {
          this.$message.error('上传头像图片大小不能超过 2MB!');
        }
        return isJPG && isLt2M;
      }
    }
  }
</script>

3.注册公共组件

  • 假如上传图片组件运用的许多,能够把该组件注册为大局组件
// 大局注册组件
import UploadImg from '@/components/UploadImg'
export default {
  install(Vue) {
    Vue.component('UploadImg', UploadImg)
  }
}
  • 假如运用的较少能够作为局部组件运用
  • 每次运用是导入父组件并注册为组件即可

4.页面中运用组件

  • 由于注册了公共组件,所以不需求在引入组件,直接写标签即可运用组件
    <!-- 职工相片 -->
      <el-form-item label="职工头像">
        <!-- 放置上传图片 -->
        <UploadImg />
        <img>
      </el-form-item>

5.运用腾讯云服务器来完结图片存储

前置基础:

1.在云服务器上的预备:申请cos服务器,装备密钥,设置cors访问console.cloud.tencent.com/cos

2.在代码层面的预备:

(1) 下载一个官方供给的操作cos服务的包(cos-js-sdk-v5)

(2) 用自己的密钥去实例化cos

(3) 具体做上传

在项目中装置依赖

npm i cos-js-sdk-v5 --save

实例化cos目标

src/components/UploadImg中实例化Cos目标,传入身份id和key

留意:这是前端中的测试写法,实际不能够把身份密钥暴露在前端代码中

// 下面的代码是固定写法
const COS = require('cos-js-sdk-v5')
// 填写自己腾讯云cos中的key和id (密钥)
const cos = new COS({
  SecretId: 'xxx', // 身份辨认ID
  SecretKey: 'xxx' // 身份密钥
})
  • 在腾讯云中找到id和秘钥

  • 上边用到的SecretId和SecretKey在这儿找到:

怎么完结图片上传预览?教你图片上传组件的封装(el-upload)

运用cos目标完结上传

给el-upload注册http-request事件

  • 把本来的action途径改为#
  • http-request事件用于掩盖默许的上传行为,能够自界说上传的完结
  <el-upload
    class="avatar-uploader"
    action="#"
    :http-request="upload"
    :show-file-list="false"
    :on-success="handleAvatarSuccess"
    :before-upload="beforeAvatarUpload"
  >
    <img v-if="imageUrl" :src="imageUrl" class="avatar">
    <i v-else class="el-icon-plus avatar-uploader-icon" />
  </el-upload>

上传事件

upload(res) {
  if (res.file) {
    // 执行上传操作
    cos.putObject({
      Bucket: 'xxxxxx', /* 存储桶 */
      Region: 'xxxx', /* 存储桶地点地域,必须字段 */
      Key: res.file.name, /* 文件名 */
      StorageClass: 'STANDARD', // 上传形式, 规范形式
      Body: res.file // 上传文件目标
    }, (err, data) => {
      console.log(err || data)
      // 上传成功之后
      if (data.statusCode === 200) {
        this.imageUrl = `https:${data.Location}`
      }
    })
  }
}

上边的Bucket和Region在这儿能够找到

怎么完结图片上传预览?教你图片上传组件的封装(el-upload)

留意:这儿不能运用function界说函数,要用箭头函数,由于this需求指向vue实例

怎么完结图片上传预览?教你图片上传组件的封装(el-upload)

图片成功预览

怎么完结图片上传预览?教你图片上传组件的封装(el-upload)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。