上传图片到腾讯云对象存储桶cos 【腾讯云对象存储桶】【cos】【el-upload】【vue3】【上传头像】【删除】

1、首先登录腾讯云官网控制台 进入对象存储页面

2、找到跨越访问CIRS设置 配置规则

 点击添加规则

 填写信息

 3、书写代码

这里用VUE3书写

第一种用按钮出发事件形式

<template>
  <div>
    <input type="file" @change="handleFileChange" />
  </div>
</template>

<script>
import COS from "cos-nodejs-sdk-v5"; // 导入cos-nodejs-sdk-v5包

export default {
  methods: {
    handleFileChange(event) {
      const file = event.target.files[0];
      const cos = new COS({
        SecretId: "YOUR_SECRET_ID",
        SecretKey: "YOUR_SECRET_KEY",
      });

      // 替换成你的 Bucket 名称和 Region
      const bucket = "YOUR_BUCKET_NAME";
      const region = "YOUR_BUCKET_REGION";

      // 生成对象存储桶中的图片路径
      const key = `images/${file.name}`;

      // 将图片上传到腾讯云对象存储桶
      cos.putObject(
        {
          Bucket: bucket,
          Region: region,
          Key: key,
          Body: file,
        },
        (err, data) => {
          if (err) {
            console.error("上传失败:", err);
              this.$message.error("上传失败")

          } else {
            console.log("上传成功:", data.Location);
              this.$message.success("上传成功")

          }
        }
      );
    },
  },
};
</script>

4、测试

点击选择文件

选择图片 

等待结果

 

第二种用el-upload

<el-upload v-if="imageUrl===null"
                     class=""
                     list-type="picture-card"
                     :show-file-list="false"
                     :before-upload="beforeUpload"
                     action=""
                     :on-change="handleUploadChange"

          >
            <el-icon class="el-icon-plus"><plus></plus></el-icon>
</el-upload>
beforeUpload(file) {
      // 预览图片
      this.file = file;
      this.imageUrl = URL.createObjectURL(file);
      console.log("头像链接为"+this.imageUrl)
      return new Promise((resolve, reject) => {
        const cos = new COS({
          SecretId: "", // 身份识别 ID
          SecretKey: "", // 身份密钥
        });

        // 替换成你的 Bucket 名称和 Region
        const bucket = "";
        const region = "";

        // 生成对象存储桶中的图片路径
        const key = `user_information/avatar/${this.user.username}/${file.name}`;

        let key1='';

        console.log("key为"+key)
        // 将文件转换为 Blob 对象
        const blob = new Blob([file.raw], { type: file.type });
        console.log("blob"+blob)

        // 将图片上传到腾讯云对象存储桶
        cos.putObject(
            {
              Bucket: bucket,
              Region: region,
              Key: key,
              Body: file,
            },
            (err, data) => {
              setTimeout(()=>{
                if (err) {
                  console.error("上传失败:", err);
                  this.$message.error("上传失败");
                  reject(err);
                } else {
                  // console.log("打撒笔"+this.user.avatarUrl)
                  console.log("上传成功:", data.Location);
                  if(this.user.avatarUrl!==null){
                    key1 = this.user.avatarUrl.replace("https://"+bucket+".cos."+region+".myqcloud.com/", "");
                    // 删除文件
                    console.log("key1:", key1);
                    cos.deleteObject({
                      Bucket: bucket,
                      Region: region,
                      Key: key1,
                    }, (err, data) => {
                      if (err) {
                        console.log('Error deleting file:', err);
                      } else {
                        console.log(data)
                        console.log('云端路径为:'+key1+"的图片已经被删除");
                      }
                    });

                  }


                  this.form.avatarUrl="https://"+ data.Location
                  this.user.avatarUrl="https://"+ data.Location

                  localStorage.setItem("user", JSON.stringify(this.user));
                  // 刷新当前页面
                  location.reload();
                  this.save1();
                  console.log(data)
                  // this.$message.success("上传图片成功");


                  resolve(false); // 阻止 Element-UI 的默认上传行为
                }

              },1000)

            }
        );

        // if(key1!==''){

        // }
      });
    },

也可以把el-upload嵌套button包装成这种形式

<el-upload
            class=""
            :show-file-list="false"
            :before-upload="beforeUpload"
            action=""
            :on-change="handleUploadChange"
            style="margin-right: 15px"
        >
        <el-button v-if="this.user.avatarUrl"  style="background-color: #3f72af;color: 
               white;border-radius: 15px;width: 100px;height: 40px" type="" >更改头像
        </el-button> 
</el-upload>

按照这个逻辑上传头像的整体代码 (写的不好 待优化 欢迎大神优化)

<div v-if="this.user.avatarUrl" class="avatar">
          <el-image id="elimg"  class="preview-image"
                    :src="this.user.avatarUrl"
                     style="width: 170px; height: 170px; position: relative; justify-content: center" >
          </el-image >
        </div>
        <div v-else class="avatar" id="avatar">
        
          <el-image id="elimg" v-if="imageUrl" class="preview-image"
                    :src="imageUrl"
                    :preview-src-list="[imageUrl]" style="width: 170px; height: 170px; position: relative; justify-content: center" >
          </el-image >
          <el-icon size="large"  v-if="imageUrl" class="el-icon-close" @click="cancelUpload"><close></close></el-icon>
          <el-upload v-if="imageUrl===null"
                     class=""
                     list-type="picture-card"
                     :show-file-list="false"
                     :before-upload="beforeUpload"
                     action=""
                     :on-change="handleUploadChange"

          >
            <el-icon class="el-icon-plus"><plus></plus></el-icon>
          </el-upload>

        </div>
import {Close, Plus} from "@element-plus/icons";
import COS from "cos-js-sdk-v5";


export default {
  name: "UserInfo",
  components: {Plus,Close},
   data(){
    return {
      form:{},
      user: localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")):{},
      imageUrl: null,
      file: null,
    }
  },

}
 beforeUpload(file) {
      // 预览图片
      this.file = file;
      this.imageUrl = URL.createObjectURL(file);
      console.log("头像链接为"+this.imageUrl)
      return new Promise((resolve, reject) => {
        const cos = new COS({
          SecretId: "", // 身份识别 ID
          SecretKey: "", // 身份密钥
        });

        // 替换成你的 Bucket 名称和 Region
        const bucket = "";
        const region = "";

        // 生成对象存储桶中的图片路径
        const key = `user_information/avatar/${this.user.username}/${file.name}`;

        let key1='';

        console.log("key为"+key)
        // 将文件转换为 Blob 对象
        const blob = new Blob([file.raw], { type: file.type });
        console.log("blob"+blob)

        // 将图片上传到腾讯云对象存储桶
        cos.putObject(
            {
              Bucket: bucket,
              Region: region,
              Key: key,
              Body: file,
            },
            (err, data) => {
              setTimeout(()=>{
                if (err) {
                  console.error("上传失败:", err);
                  this.$message.error("上传失败");
                  reject(err);
                } else {
                  // console.log("打撒笔"+this.user.avatarUrl)
                  console.log("上传成功:", data.Location);
                  if(this.user.avatarUrl!==null){
                    key1 = this.user.avatarUrl.replace("https://"+bucket+".cos."+region+".myqcloud.com/", "");
                    // 删除文件
                    console.log("key1:", key1);
                    cos.deleteObject({
                      Bucket: bucket,
                      Region: region,
                      Key: key1,
                    }, (err, data) => {
                      if (err) {
                        console.log('Error deleting file:', err);
                      } else {
                        console.log(data)
                        console.log('云端路径为:'+key1+"的图片已经被删除");
                      }
                    });

                  }


                  this.form.avatarUrl="https://"+ data.Location
                  this.user.avatarUrl="https://"+ data.Location

                  localStorage.setItem("user", JSON.stringify(this.user));
                  // 刷新当前页面
                  location.reload();
                  this.save1();
                  console.log(data)
                  // this.$message.success("上传图片成功");


                  resolve(false); // 阻止 Element-UI 的默认上传行为
                }

              },1000)

            }
        );

        // if(key1!==''){

        // }
      });
    },

cancelUpload() {
      // 清除预览图片和文件
      this.imageUrl = null;
      this.file = null;
    },
 save1(){
      this.request.post("/saveuser",this.form).then(res => {
        if(res){
          this.$message.success("保存图片成功")

        }else{
          this.$message.error("保存图片成功")

        }

      })
    },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/51376.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】详解观察者模式

文章目录 1、简介2、观察者模式简单实现抽象主题&#xff08;Subject&#xff09;具体主题&#xff08;ConcreteSubject&#xff09;抽象观察者&#xff08;Observer&#xff09;具体观察者&#xff08;ConcrereObserver&#xff09;测试&#xff1a; 观察者设计模式优缺点观察…

DataEase开源BI工具安装_数据全量_增量同步_大屏拖拽自动生成_多数据源支持_数据血缘分析---大数据工作笔记0183

我这里用的是Centos7.9安装的 可以通过uname -p来查看一下我们的电脑架构,可以看到是x86_64架构的 我们下第一个,这个是x86架构的,第二个arm架构的 然后解压到/opt/module中 然后再去重命名一下文件夹. 推荐200G 本地模式的功能比较多 推荐100G

【FPGA IP系列】FIFO的通俗理解

FPGA厂商提供了丰富的IP核&#xff0c;基础性IP核都是可以直接免费调用的&#xff0c;比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识&#xff0c;帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out&#xff0c;即先进先出。 FIFO是一个数…

C语言第十一课--------操作符的使用与分类-------基本操作

作者前言 作者介绍&#xff1a; 作者id&#xff1a;老秦包你会&#xff0c; 简单介绍&#xff1a; 喜欢学习C语言和python等编程语言&#xff0c;是一位爱分享的博主&#xff0c;有兴趣的小可爱可以来互讨 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们…

7.27 作业 QT

要求&#xff1a; 结果图&#xff1a; clock.pro: QT core gui QT texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated …

算法与数据结构(四)--排序算法

一.冒泡排序 原理图&#xff1a; 实现代码&#xff1a; /* 冒泡排序或者是沉底排序 *//* int arr[]: 排序目标数组,这里元素类型以整型为例; int len: 元素个数 */ void bubbleSort (elemType arr[], int len) {//为什么外循环小于len-1次&#xff1f;//考虑临界情况&#xf…

Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)

ODBC数据源 一些小众的数据源无法直接连接&#xff0c;需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序&#xff0c;Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…

Ansible安装部署与应用

文章目录 一、ansible简介二、ansible 环境安装部署三、ansible 命令行模块3.1 command 模块3.2 shell 模块3.3 cron 模块3.4 user 模块3.5 group 模块3.6 copy 模块3.7 file 模块3.8 hostname 模块3.9 ping 模块3.10 yum 模块3.11 service/systemd 模块3.12 script 模块3.13 m…

Staples Drop Ship EDI 需求分析

Staples 是一家美国零售公司&#xff0c;总部位于马萨诸塞州弗拉明汉&#xff0c;主要提供支持工作和学习的产品和服务。该公司于 1986 年在马萨诸塞州布莱顿开设了第一家门店。到 1996 年&#xff0c;该公司已跻身《财富》世界 500 强&#xff0c;后来又收购了办公用品公司 Qu…

Blazor前后端框架Known-V1.2.8

V1.2.8 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

【文献分享】动态环境下竟然能实现实时语义RGB-D SLAM??

论文题目&#xff1a;Towards Real-time Semantic RGB-D SLAM in Dynamic Environments 中文题目&#xff1a;动态环境下实时语义RGB-D SLAM研究 作者&#xff1a;Tete Ji, Chen Wang, and Lihua Xie 作者机构&#xff1a;新加坡南洋理工大学电气与电子工程学院 卡内基梅隆大…

C++赋值运算符重载

运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数函数名字&#xff1a;关键字operator后面接需要重载的运算符符号函数模型&#xff1a;返回值类型 operator操作符(参数列表) 注意事项&#xff1a; 1 不能通过连接其他符号…

【C++】开源:Muduo网络库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Muduo网络库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

网络知识整理

网络知识整理 网络拓扑网关默认网关 数据传输拓扑结构层面协议层面 网络拓扑 网关 连接两个不同的网络的设备都可以叫网关设备&#xff0c;网关的作用就是实现两个网络之间进行通讯与控制。 网关设备可以是交换机(三层及以上才能跨网络) 、路由器、启用了路由协议的服务器、代…

【Docker】云原生利用Docker确保环境安全、部署的安全性、安全问题的主要表现和新兴技术产生的详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

matplotlib实现动态显示图片

plt.ion()打开交互开关 plt.ioff()关闭交互开关 plt.pause(0.1)暂停0.1秒 plt.clf()#清除当前的Figure图像 plt.cla()#清除当前的Axex图像 import matplotlib.pyplot as plt import numpy as np import time from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg…

Unity自定义后处理——用偏导数求图片颜色边缘

大家好&#xff0c;我是阿赵。   继续介绍屏幕后处理效果的做法。这次介绍一下用偏导数求图形边缘的技术。 一、原理介绍 先来看例子吧。   这个例子看起来好像是要给模型描边。之前其实也介绍过很多描边的方法&#xff0c;比如沿着法线方向放大模型&#xff0c;或者用Ndo…

建设银行秋招指南,备考技巧和考试内容详解

建设银行秋招简介 银行作为非常吃香的岗位&#xff0c;每年都有不少同学通过投递简历&#xff0c;进入笔试&#xff0c;再到面试成功&#xff0c;成功到银行就职&#xff0c;也有相当一部分同学因为信息差&#xff0c;符合条件却没有报名。无法进入银行工作。 建设银行的秋招…

ACL原理

ACL原理 ACL是一种用于控制网络设备访问权限的技术&#xff0c;可以通过配置ACL来限制特定用户、应用程序或网络设备对网络资源的访问。 1、ACL&#xff08;Access Control List&#xff09; 2、ACL是一种包过滤技术。 3、ACL基于IP包头的IP地址、四层TCP/UDP头部的端口号、…

Transformer背景介绍

目录 Transformer的诞生Transformer的优势Transformer的市场 Transformer的诞生 论文地址 Transformer的优势 Transformer的市场