Vue 人资 实战篇七 员工管理下 配置腾讯云COS、封装上传图片组件、、上传到腾讯云、上传进度条、图片地址转换二维码、打印组件、

14.0 配置腾讯云Cos目标: 配置一个腾讯云cos由于上课的开发的特殊性,我们不希望把所有的图片都上传到我们自己的官方服务器上,这里我们可以采用一个腾讯云的图片方案用户上传 =》 腾讯云服务器 =》 返回地址 =》 地址存入数据库选择 对象存储 cos 模块创建存储桶(选择 公有读私有写)设置 cors 规则 (来源选择 * , 操作全部勾选)因为我们本身没有域名,所以这里设置成*****,仅限于测试,正式环境的话,这里需要配置真实的域名地址15.0 封装上传图片组件-上传组件需
摘要由CSDN通过智能技术生成

14.0 配置腾讯云Cos

目标: 配置一个腾讯云cos

由于上课的开发的特殊性,我们不希望把所有的图片都上传到我们自己的官方服务器上,这里我们可以采用一个腾讯云的图片方案

  1. 用户上传 =》 腾讯云服务器 =》 返回地址 =》 地址存入数据库
  2. 选择 对象存储 cos 模块
  3. 创建存储桶(选择 公有读私有写)
  4. 设置 cors 规则 (来源选择 * , 操作全部勾选)
    因为我们本身没有域名,所以这里设置成*****,仅限于测试,正式环境的话,这里需要配置真实的域名地址

15.0 封装上传图片组件-上传组件需求分析

目标 梳理整个的上传过程

  1. 初始化cos对象参数
名称 描述
SecretId 开发者拥有的项目身份识别 ID,用以身份认证,可在 API 密钥管理 页面获取
SecretKey 开发者拥有的项目身份密钥,可在 API 密钥管理 页面获取

注意,上述的参数我们在本次开发过程中,直接将参数放置在前端代码中存储,但是腾讯云本身是不建议这么做的,因为**敏感信息**放在前端很容易被捕获,由于我们本次是测试研发,所以这个过程可以忽略

正确的做法应该是,通过网站调用接口换取敏感信息

相关文档

  1. 实例化 上传sdk
var cos = new COS({
   
    SecretId: 'COS_SECRETID', // 身份识别 ID
    SecretKey: 'COS_SECRETKEY', // 身份密钥
});

到目前为止,我们上传图片准备的内容就已经OK,接下来,我们在**src/componets** 新建一个**ImageUpload** 组件

该组件需要满足什么要求呢?

  1. 可以显示传入的图片地址
  2. 可以删除传入的图片地址
  3. 可以上传图片到云服务器
  4. 上传到腾讯云之后,可以返回图片地址,显示
  5. 上传成功之后,可以回调成功函数

16.0 封装上传组件-代码实现

**目标**实现上传组件的代码部分

JavaScript SDK 需浏览器支持基本的 HTML5 特性(支持 IE10 以上浏览器),以便支持 ajax 上传文件和计算文件 MD5 值。

16.1 新建文件上传组件

  1. 安装JavaScript SDK
npm i cos-js-sdk-v5 --save
  1. 新建上传图片组件** src/components/ImageUpload/index.vue

上传组件,我们可以沿用element的el-upload组件,并且采用照片墙的模式 list-type="picture-card"

  1. 放置el-upload组件
<template>
  <el-upload list-type="picture-card">
     <i class="el-icon-plus" />
  </el-upload>
</template>
  1. 全局注册组件
import PageTools from './PageTools'
import UploadExcel from './UploadExcel'
import ImageUpload from './ImageUpload'
export default {
   
  install(Vue) {
   
    Vue.component('PageTools', PageTools) // 注册工具栏组件
    Vue.component('UploadExcel', UploadExcel) // 注册导入excel组件
    Vue.component('ImageUpload', ImageUpload) // 注册导入上传组件
  }
}

16.2 点击图片进行预览

  1. 限定上传的图片数量和action
<template>
      <el-upload action="#" list-type="picture-card" :limit="1" :on-preview="preview" :file-list="fileList" > 
          <i class="el-icon-plus" />
       </el-upload>
</template>

action为什么给#, 因为前面我们讲过了,我们要上传到腾讯云,需要自定义的上传方式,action给个#防止报错

  1. 预览
data() {
   
    return {
   
      fileList: [{
   url: 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1970585368,2576171845&fm=26&gp=0.jpg'}], // 图片地址设置为数组 
      showDialog: false, // 控制显示弹层
      imgUrl: ''
    }
  },
     preview(file) {
   
      // 这里应该弹出一个层 层里是点击的图片地址
      this.imgUrl = file.url
      this.showDialog = true
  },  
  1. 预览弹层
  <el-dialog title="图片" :visible.sync="showDialog">
      <img :src="imgUrl" style="width:100%" alt="">
   </el-dialog>

16.3 根据上传数量控制上传按钮

  1. 控制上传显示
 computed: {
   
    // 设定一个计算属性 判断是否已经上传完了一张
    fileComputed() {
   
      return this.fileList.length === 1
    }
  },
 <el-upload
      :on-preview="preview"
      :on-remove="handleRemove"
      :on-change="changeFile"
      :file-list="fileList"
      list-type="picture-card"
      action="#"
      :limit="1"
      :class="{disabled: fileComputed }"
    >

<style>
.disabled .el-upload--picture-card {
   
  display: none
}
</style>

16.4 删除图片和添加图片

  1. 删除文件
	 handleRemove(file) {
   
      // file是点击删除的文件
    //   将原来的文件给排除掉了 剩下的就是最新的数组了
      this.fileList = this.fileList.filter(item => item.uid !== file.uid)
    },
  1. 添加文件
    // 修改文件时触发
    // 此时可以用fileList 因为该方法会进来很多遍 不能每次都去push
    // fileList因为fileList参数是当前传进来的最新参数 我们只需要将其转化成数组即可 需要转化成一个新的数组
    // [] => [...fileList] [] => fileList.map()
    // 上传成功之后 还会进来 需要实现上传代码的逻辑 这里才会成功
    changeFile(file, fileList) {
   
      this.fileList = fileList.map(item => item)
    }

16.5 上传之前检查

控制上传图片的类型和上传大小, 如果不满足条件 返回false上传就会停止

   :before-upload="beforeUpload"  // 添加 事件

beforeUpload(file) {
   
      // 要开始做文件上传的检查了
      // 文件类型 文件大小
      const types = ['image/jpeg', 'image/gif', 'image/bmp', 'image/png']
      // 数组的 includes 方法  返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。该方法属于 ES7 ,但 Babel 转码器已经支持。
      if (!types.includes(file.type)) {
   
        this.$message.error('上传图片只能是 JPG、GIF、BMP、PNG 格式!')
        return false
      }
      //  检查大小
      const maxSize = 5 * 1024 * 1024
      if (maxSize < file.size) {
   
        this.$message.error('图片大小最大不能超过5M')
        return false
      }
      return true
    }

16.6 上传动作调用上传腾讯云

  1. 上传动作为el-upload的http-request属性
 :http-request="upload"

    // 自定义上传动作 有个参数 有个file对象,是我们需要上传到腾讯云服务器的内容
    upload(params) {
   
      console.log(params.file)
    }

我们需要在该方法中,调用腾讯云的上传方法

腾讯云文档地址

身份ID和密钥可以通过腾讯云平台获取

登录 访问管理控制台 ,获取您的项目 SecretId 和 SecretKey。

  1. 实现代码
import COS from 'cos-js-sdk-v5'
var cos = new COS({
   
    SecretId: 'COS_SECRETID', // 身份识别 ID
    SecretKey: 'COS_SECRETKEY', // 身份密钥
});
// 这个的,密钥在上面查找怎么获取

// 进行上传操作
    upload(params) {
   
    //   console.log(params.file)
      if (params.file) {
   
        // 执行上传操作
        cos.putObject({
   
          Bucket: 'shuiruohanyu-106-1302806742', // 存储桶
          Region: 'ap-beijing', // 地域
          Key: params.file.name, // 文件名
          Body: params.file, // 要上传的文件对象
          StorageClass: 'STANDARD' // 上传的模式类型 直接默认 标准模式即可
          // 上传到腾讯云 =》 哪个存储桶 哪个地域的存储桶 文件  格式  名称 回调
        }, function(err, data) {
   
          // data返回数据之后 应该如何处理
          console.log(err || data)
        })
      }
    }

16.7 上传成功之后处理返回数据

如何处理返回成功的返回数据

  1. 确定要上传记录id
  currentFileUid: null, // 上传 id 添加一个data里面的数据

beforeUpload(file) {
   
      //   先检查文件类型
      const types = ['image/jpeg', 'image/gif', 'image/bmp', 'image/png']
      if (!types.some(item => item === file.type)) {
   
        //   如果不存在
        this.$message.error('上传图片只能是 JPG、GIF、BMP、PNG 格式!')
        return false // 上传终止
      }
      // 检查文件大小  5M 1M = 1024KB 1KB = 1024B
      const maxSize = 5 * 1024 * 1024
      if (file.size > maxSize) {
   
        //   超过了限制的文件大小
        this.$message.error('上传的图片大小不能大于5M')
        return false
      }
      //   已经确定当前上传的就是当前的这个file了
      this.currentFileUid = file.uid
      return true // 最后一定要return  true
    },
  1. 处理返回数据
    // 进行上传操作
    upload(params) {
   
    //   console.log(params.file)
      if (params.file) {
   
        // 执行上传操作
        cos.putObject({
   
          Bucket: 'shuiruohanyu-106-1302806742', // 存储桶
          Region: 'ap-beijing', // 地域
          Key: params.file.name, // 文件名
          Body: params.file, // 要上传的文件对象
          StorageClass: 'STANDARD' // 上传的模式类型 直接默认 标准模式即可
          // 上传到腾讯云 =》 哪个存储桶 哪个地域的存储桶 文件  格式  名称 回调
        }, (err, data) => {
   
          // data返回数据之后 应该如何处理
          console.log(err || data)
          // data中有一个statusCode === 200 的时候说明上传成功
          if (!err && data.statusCode === 200) {
   
            //   此时说明文件上传成功  要获取成功的返回地址
            // fileList才能显示到上传组件上 此时我们要将fileList中的数据的url地址变成 现在上传成功的地址
            // 目前虽然是一张图片 但是请注意 我们的fileList是一个数组
            // 需要知道当前上传成功的是哪一张图片
            this.fileList = this.fileList.map(item => {
   
              // 去找谁的uid等于刚刚记录下来的id
              if (item.uid === this.currentFileUid) {
   
                // 将成功的地址赋值给原来的url属性
                return {
    url: 'http://' + data.Location, upload: true }
                // upload 为true 表示这张图片已经上传完毕 这个属性要为我们后期应用的时候做标记
                // 保存  => 图片有大有小 => 上传速度有快又慢 =>要根据有没有upload这个标记来决定是否去保存
              }
              return item
            })
            // 将上传成功的地址 回写到了fileList中 fileList变化  =》 upload组件 就会根据fileList的变化而去渲染视图
          }
        })
      }
    }

我们在fileList中设置了属性为upload为true的属性,表示该图片已经上传成功了,如果fileList还有upload不为true的数据,那就表示该图片还没有上传完毕

16.8 上传的进度条显示

为了再上传图片过程中显示进度条,我们可以使用element-ui的进度条显示当前的上传进度

  1. 放置进度条
 <el-progress v-if="showPercent" style="width: 180px" :percentage="percent" />
      percent: 0, // 进度条的百分比
      showPercent: false,// 默认不显示进度条
  1. 通过腾讯云sdk监听上传进度
       this.showPercent = true  // 看完整代码 ,在上传文件的预验证里面

cos.putObject({
   
          // 配置
          Bucket: 'laogao-1302806742', // 存储桶名称
          Region: 'ap-guangzhou', // 存储桶地域
          Key: params.file.name, // 文件名作为key
          StorageClass: 'STANDARD', // 此类写死
          Body: params.file, // 将本地的文件赋值给腾讯云配置
          // 进度条
          
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值