vue项目实现图片上传到腾讯云

1.封装UploadImg组件

1.1下载依赖包

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

1.2 封装一个具有上传功能的组件 

我这里结合element-ui中的 <el-upload>来进行封装的(官网cv)

  • show-file-list: 是否显示上传的文件列表

  •  action:  用来指定文件要上传的地址 这里我们要自定义上传动作 所以写#

  • :http-request:自定义上传的行为动作 后面跟一个方法

  •  on-success: 上传成功之后的回调

  •  before-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>

<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>

 

 我们通过上传前的函数就可以判断用户上传的类型  这里面会自动传入一个参数  这个参数代表当前上传的信息对象  打印了file

 2.全局注册组件

import UploadImg from './UploadImg'
export default {
  install(p) {
    p.component(UploadImg.name, UploadImg)
  }
}

3.实例化cos

在封装的UploadImg组件中实例化cos  这是固定写法 需要分别传入腾讯云中的身份识别id和密钥 


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

如何寻找密钥?请看下图

云产品=>访问管理=>api密钥管理   在代码楚填入对应的密钥

 4.核心代码 

可以重新声明一个方法  也可以直接在上传之前的函数里面进行业务逻辑  

  if (file) {
      // 执行上传操作
        cos.putObject({
          Bucket: 'xxx', /* 存储桶 */
          Region: 'xxx', /* 存储桶所在地域,必须字段 */
          Key: file.name, /* 文件名 */
          StorageClass: 'STANDARD', // 上传模式, 标准模式
          Body: file // 上传文件对象
        }, (err, data) => {
          console.log(err || data)
          // 上传成功之后
          if (data.statusCode === 200) {
            // console.log(data)
            this.$emit('input', 'https://' + data.Location)
            // this.imageUrl = `https:${data.Location}`
          }
        })
      }

 5.无法显示图片修复

上传成功后腾讯云给我们返回的是这样一个字符串

6.v-modle双向绑定

这里如果我要显示图片 那就可以使用v-modle  在子组件标签身上定义v-modle相当于像子组件传入了一个value 属性 子组件上传成功后 利用this.$emit('input')触发input事件将腾讯云返回的图片地址进行传递过去 就会造成子组件更新

子组件的标签上

    <UploadImg v-model="imgUrl" />

子组件上传成功后

    this.$emit('input', 'https://' + data.Location)

 7.完整代码

        7.1 UploadImg组件

<template>
  <!--
      show-file-list: 是否显示上传的文件列表

      action: '#' 用来指定文件要上传的地址,由于我们需要定制上传动作
             这里设为#
      :http-request:自定义上传行为(重点)

      on-success: 上传成功之后的回调
      before-upload: 上传之前的检查
      :on-success="handleAvatarSuccess"
    -->
  <el-upload
    class="avatar-uploader"
    action="#"
    :show-file-list="false"
    :on-success="handleAvatarSuccess"
    :before-upload="beforeAvatarUpload"
  >

    <img v-if="value" :src="value" class="avatar">

    <i v-else class="el-icon-plus avatar-uploader-icon" />
  </el-upload>
</template>
<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>
// 下面的代码是固定写法
const COS = require('cos-js-sdk-v5')
// 填写自己腾讯云cos中的key和id (密钥)
const cos = new COS({
  SecretId: 'xxx', // 身份识别ID
  SecretKey: 'xxx' // 身份秘钥
})
export default {
  name: 'UploadImg',
  props: {
    value: {
      type: String,
      required: true
    }
  },
  data() {
    return {
    }
  },
  methods: {
    handleAvatarSuccess(res, file) {
      this.imageUrl = URL.createObjectURL(file.raw)
    },
    beforeAvatarUpload(file) {
      console.log(file)
      const isJPG = file.type === 'image/jpeg'
      const isLt2M = file.size / 1024 / 1024 < 2

      if (!isJPG) {
        return this.$message.error('上传头像图片只能是 JPG 格式!')
      }
      if (!isLt2M) {
        return this.$message.error('上传头像图片大小不能超过 2MB!')
      }
      this.upload(file)
    },
    upload(file) {
      if (file) {
      // 执行上传操作
        cos.putObject({
          Bucket: 'wh66-xxx', /* 存储桶 */
          Region: 'ap-xxx', /* 存储桶所在地域,必须字段 */
          Key: file.name, /* 文件名 */
          StorageClass: 'STANDARD', // 上传模式, 标准模式
          Body: file // 上传文件对象
        }, (err, data) => {
          console.log(err || data)
          // 上传成功之后
          if (data.statusCode === 200) {
            // console.log(data)
            this.$emit('input', 'https://' + data.Location)
            // this.imageUrl = `https:${data.Location}`
          }
        })
      }
    }
  }
}
</script>

        7.2 父组件使用

   <UploadImg v-model="userInfo.staffPhoto" /></el-form-item>

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3是一种流行的JavaScript框架,用于构建用户界面。它具有响应式数据绑定、组件化开发和虚拟DOM等特性,使得开发者可以更高效地构建交互式的Web应用程序。 要在Vue3中实现上传图片到阿里云OSS,你可以按照以下步骤进行操作: 1. 安装依赖:首先,你需要安装阿里云OSS的JavaScript SDK。可以使用npm或yarn命令来安装,例如: ``` npm install ali-oss ``` 2. 配置OSS客户端:在Vue3的代码中,你需要创建一个OSS客户端实例,并配置相关参数,如AccessKeyId、AccessKeySecret、Endpoint等。这些参数可以在阿里云OSS控制台中获取。 3. 创建上传组件:在Vue3中,你可以创建一个上传组件,用于选择图片文件并触发上传操作。可以使用`<input type="file">`元素来实现文件选择功能,并监听其`change`事件。 4. 上传图片:在上传组件中,你可以编写上传图片的逻辑。当用户选择了图片文件后,你可以通过OSS客户端调用`put`方法来上传图片文件到阿里云OSS。 下面是一个简单的示例代码,演示了如何在Vue3中上传图片到阿里云OSS: ```javascript <template> <div> <input type="file" @change="handleFileChange"> </div> </template> <script> import OSS from 'ali-oss'; export default { methods: { handleFileChange(event) { const file = event.target.files[0]; const client = new OSS({ accessKeyId: 'your-access-key-id', accessKeySecret: 'your-access-key-secret', bucket: 'your-bucket-name', region: 'your-oss-region', // 其他配置参数... }); // 生成唯一的文件名 const fileName = Date.now() + '-' + file.name; // 调用OSS客户端的put方法上传文件 client.put(fileName, file).then(response => { console.log('上传成功', response); // 在这里可以处理上传成功后的逻辑 }).catch(error => { console.error('上传失败', error); // 在这里可以处理上传失败后的逻辑 }); } } } </script> ``` 请注意,上述代码中的`your-access-key-id`、`your-access-key-secret`、`your-bucket-name`和`your-oss-region`需要替换为你自己的阿里云OSS相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值