react中基于腾讯云cos上传图片组件

news2024/11/17 6:54:58

react中基于腾讯云cos上传图片组件

    • 效果示例图
    • 上传图片组件imageUpload
      • components/imageUpload/index.jsx
      • components/imageUpload/upload.scss
    • 使用组件

效果示例图

在这里插入图片描述

上传图片组件imageUpload

npm install cos-js-sdk-v5 -S

components/imageUpload/index.jsx

import "./upload.scss";
import uploadImg from "../../assets/images/icon_upload_default.png";
import { useEffect, useState } from "react";

const COS = require("cos-js-sdk-v5");
const Bucket = "yugioh-xxx";
const Region = "ap-shanghai";
//创建一个 COS SDK 实例
const cos = new COS({
  SecretId: "xxxxx",
  SecretKey: "xxxx",
});

//图片item
function ImageItem(props) {
  let item = props.item;

  // 删除图片
  function deleteImageHandle(params) {
    props.click(params);
  }

  return (
    <li className="image-item" key={item.uid}>
      <img className="imgage-icon" alt={item.name} src={item.url} />
      <div
        className="imgage-delete"
        onClick={() => {
          deleteImageHandle(item);
        }}
      >
        删除
      </div>
    </li>
  );
}

function UploadImages(props) {
  //文件类型, 例如['png', 'jpg', 'jpeg']
  let [fileType, setFileType] = useState(["png", "jpg", "jpeg"]);
  //数量限制
  let [limit, setLimit] = useState(5);
  //大小限制 (MB)
  let [fileSize, setFileSize] = useState(20);

  let [fileList, setFileList] = useState([]);

  /**
   * 上传前校检格式和大小
   * **/
  function verifyUploadFile(file) {
    // 校检文件类型
    if (fileType) {
      let fileExtension = "";
      if (file.name.lastIndexOf(".") > -1) {
        fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
      }
      const isTypeOk = fileType.some((type) => {
        if (file.type.indexOf(type) > -1) return true;
        if (fileExtension && fileExtension.indexOf(type) > -1) return true;
        return false;
      });
      if (!isTypeOk) {
        console.log(`文件格式不正确, 请上传${fileType.join("/")}格式文件!`);
        return false;
      }
    }
    // 校检文件大小
    if (fileSize) {
      const isLt = file.size / 1024 / 1024 < fileSize;
      if (!isLt) {
        console.log(`上传文件大小不能超过 ${fileSize} MB!`);
        return false;
      }
    }
    return true;
  }

  /**
   * 上传图片到腾讯云
   * **/
  function uploadFileToTencentClound(file) {
    return new Promise((resolve) => {
      cos.putObject(
        {
          Bucket: Bucket /* 存储桶 */,
          Region: Region /* 存储桶所在地域,必须字段 */,
          Key: "fileImage/" + file.name /* 文件名 */,
          StorageClass: "STANDARD", // 上传模式, 标准模式
          Body: file, // 上传文件对象
          onProgress: function (info) {
            console.log("[cos.postObject-seccess]", JSON.stringify(info));
          },
        },
        function (err, data) {
          console.log("[cos.postObject-err]", err || data);
          resolve(data.Location);
        }
      );
    });
  }
  /**
   * 监听input[type=file]是否变化
   * **/
  function uploadFileHandle(e) {
    let files = e.target.files;
    if (files.length > 0) {
      if (fileList.length + files.length <= limit) {
        for (let i = 0; i < files.length; i++) {
          if (verifyUploadFile(files[i])) {
            uploadFileToTencentClound(files[i]).then((response) => {
              fileList.push({
                uid: files[i].lastModified,
                name: files[i].name,
                url: "https://" + response,
              });

              setFileList([...fileList]);
            });
          }
        }
      } else {
        console.log(`上传文件数量不能超过 ${limit} 个!`);
      }
    }
  }

  //删除图片
  function deleteHandle(e) {
    setFileList((current) => current.filter((file) => file.uid !== e.uid));
  }

  useEffect(() => {
    if (props.fileType) {
      setFileType(props.fileType);
    }
    if (props.limit) {
      setLimit(props.limit);
    }
    if (props.fileSize) {
      setFileSize(props.fileSize);
    }

    console.log("[fileList]", fileList);
    props.upload(fileList);
  }, [props, fileList]);

  return (
    <>
      {fileList.length < limit ? (
        <div className="uploadImage">
          <label className="label" htmlFor="uploadFile">
            <img alt="" className="upload-icon" src={uploadImg} />
            <div className="upload-text">上传图片</div>
          </label>
          <input
            type="file"
            name="uploadFile"
            id="uploadFile"
            multiple
            onChange={uploadFileHandle}
          />
        </div>
      ) : (
        <></>
      )}

      {/* 图片列表 */}
      <ul className="imageList">
        {fileList.map((item) => (
          <ImageItem key={item.uid} item={item} click={deleteHandle} />
        ))}
      </ul>
    </>
  );
}

export default UploadImages;

components/imageUpload/upload.scss

.uploadImage {
  border: 1px solid #dcdcdc;
  border-radius: 4px;
  width: 100px;
  height: 100px;
  position: relative;
  overflow: hidden;
  .label {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    cursor: pointer;
    .upload-icon {
      width: 54px;
      height: 32px;
    }
    .upload-text {
      margin-top: 6px;
    }
  }
  input[name="uploadFile"] {
    opacity: 0;
  }
}

.imgStyle {
  width: 200px;
  height: auto;
  margin-top: 6px;
}

.imageList {
  width: 100%;
  display: flex;
  flex-direction: column;
  .image-item {
    border: 1px solid #dcdcdc;
    border-radius: 4px;
    display: flex;
    flex-direction: row;
    position: relative;
    margin: 4px 4px;
    padding: 2px 2px;
    .imgage-icon {
      width: auto;
      height: 100px;
    }
    .imgage-delete {
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      right: 20px;
      font-size: 16px;
      color: #ff0000;
    }
  }
  .image-item:hover {
    border: 1px solid #ff0000;
    cursor: pointer;
  }
}

使用组件

import { useEffect } from "react";
//上传图片
import ImageUpload from "../../components/imageUpload";

function Upload() {
  function uploadHandle(params) {
    console.log("[0]", params);
  }

  useEffect(() => {
    console.log("[upload]");
  }, []);

  return (
    <>
      <div>选择图片</div>
      <ImageUpload upload={uploadHandle} />
    </>
  );
}
export default Upload;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac 打开/关闭 iCloud 后导致桌面文件夹、文档删除,恢复步骤!

不小心打开/关闭了 iCloud 后&#xff0c;导致桌面内容全部丢失&#xff0c;再次打开同步&#xff0c;发现还是确实很多内容&#xff0c;如何找回最初的文件副本。 当 iCloud 关闭时&#xff0c;会将任何未上传到 iCloud 云盘的文稿内容转移打包放到当前 Mac 电脑的个人文件夹…

ChatGPT批量生成文章软件:助力创作高效快捷文章

随着人工智能技术的不断发展&#xff0c;ChatGPT批量生成文章软件已经成为了一种强大的创作工具。它能够通过自然语言处理和机器学习算法&#xff0c;快速生成高质量的文章&#xff0c;为创作者提供了高效快捷的创作体验。本文将从随机8-20个方面对ChatGPT批量生成文章软件进行…

【从零开始学习JAVA | 第二十一篇】常见API介绍 System

目录 前言&#xff1a; System&#xff1a; System类中静态方法&#xff1a; 总结&#xff1a; 前言&#xff1a; system 是一个很底层的 API&#xff0c;是一个工具类&#xff0c;提供了一些与系统相关的方法。他在我们写项目的时候提供了一些非常实用的方法&#xff0c;本…

基于Filebeat+Kafka+ELK实现Nginx日志收集并采用Elastalert2实现钉钉告警

目录 基于FilebeatKafkaELK实现Nginx日志收集1.规划好项目架构图2.部署前端web集群3.部署ES集群集群介绍环境准备集群搭建分片和副本 4.部署kafka集群环境准备静态IP配置重启网络服务域名解析设置安装时间同步服务关闭防火墙和selinux kafka集群依赖于zookeeperkafaka和zookeep…

8 系统定时器(Systick)

目录 系统定时器&#xff08;Systick&#xff09; SysTick定时器特性介绍 SysTick定时器的功能 SysTick定时器寄存器介绍 Systick定时器的使用 系统定时器&#xff08;Systick&#xff09; SysTick定时器特性介绍 计数宽度&#xff1a; 24bit来存储数据&#xff0c;2^24…

HOT21-搜索二维矩阵II

leetcode原题链接&#xff1a; 搜索二维矩阵II 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[…

【CSS3系列】第八章 · 伸缩盒模型

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

基于matlab使用深度学习的语义分割算法实现(附源码)

一、前言 此示例演示如何使用语义分割网络对图像进行分割。 语义分割网络对图像中的每个像素进行分类&#xff0c;从而生成按类分割的图像。语义分割的应用包括自动驾驶的道路分割和医疗诊断的癌细胞分割。 此示例首先向您展示如何使用预训练的 Deeplab v3 [1] 网络分割图像&am…

git权限异常:fatal: Authentication failed for

本地电脑用户密码修改了&#xff0c;git 提交&#xff0c;拉取出现异常, 就会报这个错误fatal: Authentication failed for http://xxx/xxx/xxx 解决方法&#xff1a; git config --system --unset credential.helper 免输入用户密码方法&#xff1a; git config --global…

【超简单】Ubuntu 安装 bcompare 对比工具

下载 bcompare 安装包&#xff1a;《bcompare-4.4.6.27483_amd64.deb》 https://www.scootersoftware.com/download.php?zzdl4 安装 becompare 安装&#xff1a; sudo dpkg -i bcompare-4.4.6.27483_amd64.deb破解 cd /usr/lib/beyondcompare/ sudo sed -i "s/kee…

革新写作方式:ChatGPT最新版带来高质量聚合文章的批量生成

随着人工智能技术的不断发展&#xff0c;自然语言处理模型也在不断进步。ChatGPT最新版作为一种强大的语言模型&#xff0c;可以生成高质量的聚合文章&#xff0c;为写作方式带来了革新。本文将详细阐述ChatGPT最新版带来的革新之处&#xff0c;包括其应用领域、生成文章的流程…

剑指 Offer 12: 矩阵中的路径

这道题看着简直是完全没思路&#xff0c;看了下发现是使用回溯的方法。 下面这里要注意&#xff0c;newi是旧的i加上新的偏移值&#xff01;newj同理&#xff0c;并不是加自己&#xff0c;别昏头&#xff01; s是String类型的变量&#xff0c;要写成size() 下面是正确的代码&a…

计算机组成原理笔记——指令系统、中央处理器、总线、I/O系统(王道考研)(持续更新)

文章目录 前言指令系统指令系统概述指令格式扩展操作码 指令寻址方式指令寻址数据寻址基本的寻址思路偏移寻址隐含寻址 程序的机器级代码表示汇编基础AT&T格式和Intel格式C语言控制结构的汇编表示函数调用栈帧切换栈帧构造 CISC与RISC 中央处理器CPU的功能和基本结构运算器…

企业级微服务架构实战项目--xx优选-详情页面的异步调用completablefuture

一 常见的调用方式 1.1 并发 并发&#xff1a;同一时刻多个线程在访问同一个资源&#xff0c;多个线程对一个点 ​ 例子&#xff1a;春运抢票、微信抢红包、电商秒杀... 1.2 同步串行 代表多任务按先后顺序执行&#xff0c;并且都是同一个线程来执行。 1.3 异步串行 代表…

【Java面试题】Java基础语法

文章目录 JDK、JRE和JVM的关系栈和堆分别存的什么数据异步和同步线程和进程区别java的数据类型有哪些equals和HashCode重写的问题?深拷贝和浅拷贝的区别和equals的区别常见的运行时异常有哪些&#xff1f; JDK、JRE和JVM的关系 JDK、JRE和JVM的关系&#xff1a; JDK(Java De…

数据库监控与调优【一】—— 数据库调优的维度

数据库调优的维度 左边是千金良方的&#xff0c;右边是个人优化的 业务需求 不合理的需求&#xff0c;可能会造成很多问题勇敢地对不合理的需求说不拨乱反正&#xff0c;把不合理的需求变成合理的需求 例子 财务SaaS系统&#xff0c;财务领域有种叫做代账的概念&#xff0c…

uniapp+vue3+vite+ts+uviewPlus搭建项目

创建项目架构 首先使用官方提供的脚手架创建一个项目&#xff0c;这里我创建的 vue3 vite ts 的项目&#xff1a; npx degit dcloudio/uni-preset-vue#vite-ts project-name&#xff08;如命令行创建失败&#xff0c;请直接访问 giteehttps://gitee.com/dcloud/uni-preset-vu…

2023-06-20 x-ui-服务器配置记录

基础软件: yum update -y yum install -y curl yum install -y socat 工作软件: bash <(curl -Ls https://raw.githubusercontent.com/sprov065/x-ui/master/install.sh) 设置: 参考: 使用云服务器搭建代理-腾讯云开发者社区-腾讯云

9 HAL库驱动框架简述

目录 HAL库驱动框架简述 HAL库外设设计思想 HAL库和Cube MX相结合 一、对外设的封装——句柄结构体 二、外设初始化 初始化结构体 初始化的逻辑 三、外设使用逻辑 通用接口函数 初始化函数 I/O操作函数 控制函数 状态参数 扩展接口函数 总结 补充&#xff1a;H…

算法拾遗三十四线段树

算法拾遗三十四线段树 线段树说明物理结构使用线段树落方块的问题 线段树说明 给定固定长度的数组&#xff0c;然后要在数组给定的范围内完成加法【如数组1&#xff0c;200下标元素加6】&#xff0c;更新【7&#xff0c;375范围数组元素更新为4】&#xff0c;查询操作【查询3到…