Vue项目之上传图片

要实现点击上传后上传图片资源到第三方服务器上

 

利用element组件 随便搞一个上传框 和创建一个vue文件 准备一张图片 另外有第三方服务器的地址id k 这里用的是腾讯云的cos对象存储桶   

第一步 安装JavaScript SDK

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

第二步创建文件切准备好上传的基础属性

<template>
  <div>
 <!-- el-upload 组件  该组件内部会自己使用原生的xhr进行请求的发送-->
    <!-- list-type 是列表的类型 可选值 text/picture/picture-card -->
    <!-- action 是上传的地址 -->
    <!-- name 是上传的文件字段名 -->
    <!-- headers 是请求头的信息 -->
    <!-- on-success 上传成功的钩子函数,这里可以获取到服务器返回的数据 -->
    <!-- auto-upload 自动上传功能,默认为true -->
    <!-- http-request 覆盖默认的上传行为,自己写上传的逻辑功能-->
    <!-- file-list是默认展示的图片内容,一般用于做回显功能 ; file-list 的数据不是双向绑定的 -->
    <el-upload
      list-type="picture-card" 
      :file-list="fileList"
      :on-remove="onRemove"
      :on-preview="onPreview"
      :on-change="onChange"
      :before-upload="beforeUpload"
      action="#"
      :class="{ hidden: fileComputed }"
      :http-request="httpRequest"
    >
      <i class="el-icon-plus" />
      <el-progress v-if="percentageShow" :percentage="percentage"></el-progress>
    </el-upload>
    <el-dialog title="预览图片" :visible.sync="showDialog" width="30%">
      <img :src="imgUrl" style="width: 100%" alt="" />
    </el-dialog>
  </div>
</template>

第三步引入COS

import COS from "cos-js-sdk-v5";

第四步定义data 

  data() {
    return {
      fileList: [], // 图片地址设置为数组
      showDialog: false, // 控制显示弹层
      imgUrl: "",
      currentFileUid: "", // 当前上传的uid
      percentage: 0, // 进度条
      percentageShow: false, // 进度条显示
    };
  },

第五步事件方法逻辑编辑

methods: {
    // 移除事件
    onRemove(val) {
      this.fileList = this.fileList.filter((item) => item.uid !== val.uid);
    },
    // 预览事件
    onPreview({ url }) {
      this.imgUrl = url;
      this.showDialog = true;
    },
    // 文件发送改变的时候触发==> 添加文件、上传成功和上传失败时都会被调用
    // file是选择的文件信息(上传的信息)
    // fileList 是最新的上传列表
    // 不能使用push,原因是因为会调用多次!就会不断push到里面去
    onChange(file, fileList) {
      this.fileList = fileList.map((item) => item);
    },
    // 上传前的操作
    beforeUpload(file) {
      // 体积检测
      const maxSize = 7; // 最大5M
      if (file.size / 1024 / 1024 > maxSize) {
        this.$message.warning(`体积不能超过${maxSize}M`);
        return false;
      }
      // 类型检测
      const types = ["image/png", "image/jpg", "image/jpeg", "image/gif"];
      if (!types.includes(file.type)) {
        this.$message.warning("文件支支持jpg,png,gif,jpeg");
        return Promise.reject("类型错误");
      }
      // 记录这一次上传的uid
      this.currentFileUid = file.uid;
      // 进度条打开
      this.percentageShow = true;
    },
    // 上传行为
    httpRequest(file) {
      console.log(file);
      // 将来也可以写自己的上传逻辑!
      // 调用第三方的sdk实现上传功能
      // 文档地址:上传的服务地址
      // cos.putObject(配置对象,回调函数)
      cos.putObject(
        {
          Bucket: "xxxxxxxxxxxxxxx" /* 填入您自己的存储桶,必须字段 */,
          Region: "xxxxxxxxxxxxxxx" /* 存储桶所在地域,例如ap-beijing,必须字段 */,
          Key: file.file
            .name /* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),必须字段 */,
          StorageClass: "STANDARD",
          Body: file.file, // 上传文件对象
          onProgress: (progressData) => {
            // 上传中执行事件
            this.percentage = progressData.percent * 100;
          },
        },
        (err, data) => {
          if (err) {
            console.log(err);
            this.percentageShow = false;
            return this.$message.error("上传失败");
          }
          // 成功后的处理逻辑
          this.fileList = this.fileList.map((item) => {
            if (item.uid === this.currentFileUid) {
              item.url = "http://" + data.Location; // 替换真正的地址
              item.upload = true; // 记录该文件已经上传完成
            }
            return item;
          });
          // 关闭
          setTimeout(() => {
            this.percentageShow = false;
          }, 1000);
        }
      );
    },
  },

最后判断是否上传了

  computed: {
    // 设定一个计算属性 判断是否已经上传完了一张
    fileComputed() {
      return this.fileList.length === 1;
    },
  },

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值