Vue+Nodejs+Express+Minio 实现本地图片上传

news2024/11/17 13:46:50
  1. 安装Minio,Minio serverMinio client都要下载可以自定义安装目录

    1. 安装完成之后,可以将minio配置成环境变量方便使用
      在这里插入图片描述

    2. 配置了环境变量启动命令式 minio server start,默认账号密码minioadmin和minioadmin,点击9000端口的这个链接,即可访问客户端

在这里插入图片描述

在这里插入图片描述

  1. nodejs连接Minio,简易服务进行图片上传,比较简单,直接上代码

    const express = require('express');
    const Minio = require('minio');
    const bodyParser = require('body-parser'); // 解析 req.body
    const multer = require('multer');//formdata数据处理
    const cors = require('cors'); //设置允许跨域
    const upload = multer();
    
    const minioClient = new Minio.Client({
      endPoint: 'localhost',
      port: 9000,
      useSSL: false,
      accessKey: 'xxx', //这里换成自己的
      secretKey: 'xxx', //这里换成自己的
    });
    
    const app = express();
    app.use(cors());
    app.use(bodyParser.json());
    
    app.post('/upload', upload.single('file'), async (req, res) => {
      try {
        const file = req.file; // 获取上传文件
        const bucketName = 'xxx'; //自己创建的桶名
        const objectName = Date.now() + '_' + file.originalname; // 设置对象名称
        const data = await minioClient.putObject(bucketName, objectName, file.buffer); // 上传到MinIO
        console.log(data);
        res.send({
          code: 200,
          url: `http://localhost:9000/${bucketName}/${objectName}`, // 返回访问URL
        });
      } catch (err) {
        res.status(500).send(err);
      }
    });
    
    app.listen(8808, () => {
      console.log('listening on port 8808');
    });
    
    

在这里插入图片描述

  1. Vue前端代码

    1. 效果图如下

    在这里插入图片描述

    1. 代码

      <template>
          <div class="minio-container common-container">
              <el-button icon="el-icon-upload2" type="primary" @click="handleUploadFile">上传</el-button>
              <transition name="transition-preview">
                  <div class="demo-image__preview" style="margin-top:20px" v-if="imageUrl">
                      <el-image style="width: 100px; height: 100px" :src="imageUrl" :preview-src-list="srcList">
                      </el-image>
                  </div>
              </transition>
          </div>
      </template>
      
      <script>
      import { Message } from "element-ui";
      import { isImage } from "@/utils";
      import { uploadImage } from "@/request/api";
      
      export default {
          data() {
              return {
                  imageUrl: "",
                  srcList: [],
              };
          },
      
          methods: {
              handleUploadFile() {
                  const input = document.createElement("input");
                  input.setAttribute("type", "file");
                  input.setAttribute("multiple", "multiple");
                  input.setAttribute("accept", "image/*");
                  input.click();
                  const _this = this; // 如果不想使用这种语法,onchange的函数换成箭头函数,即可解决this指向问题
                  input.onchange = async function (event) {
                      const file = event.target.files[0];
                      if (!isImage(file)) {
                          return Message.error("不是可上传的图片格式");
                      }
                      const formData = new FormData();
                      formData.append("file", file);
                      const data = await uploadImage(formData);
                      if (data?.code && data.code == 200) {
                          _this.imageUrl = data.url;
                          _this.srcList = [].concat(data.url);
                      }
                  };
                  input.remove();
              },
          },
      };
      </script>
      
      <style lang='scss' scoped>
      .fold-height-enter-active,
      .fold-height-leave-active {
          transition: height 0.5s ease;
          overflow: hidden;
      }
      
      .fold-height-enter,
      .fold-height-leave-to {
          height: 0 !important;
      }
      </style>
      
    2. api.js

      import request from './request';
      
      const URLS = {
        uploadImage: '/upload',
      };
      
      export const uploadImage = (data) => request({ method: 'post', url: URLS.uploadImage, data });
      
      

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

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

相关文章

Git全栈体系(三)

第六章 GitHub 操作 一、创建远程仓库 二、远程仓库操作 命令名称作用git remote -v查看当前所有远程地址别名git remote add 别名 远程地址起别名git push 别名 分支推送本地分支上的内容到远程仓库git clone 远程地址将远程仓库的内容克隆到本地git pull 远程库地址别名 远…

k8s安装Jenkins

目录 ​编辑 一、环境准备 1.1 环境说明 二、安装nfs 2.1 安装NFS 2.2 创建NFS共享文件夹 2.3 配置共享文件夹 2.4 使配置生效 2.5 查看所有共享目录 2.6 启动nfs 2.7 其他节点安装nfs-utils 三、创建PVC卷 3.1 创建namespace 3.2 创建nfs 客户端sa授权 3.3 创建…

如何用python画一朵花,用python画彩色六边形

大家好&#xff0c;小编为大家解答用python画彩色六边形的问题。很多人还不知道如何用python画一朵花&#xff0c;现在让我们一起来看看吧&#xff01;

63 # commander 的配置

初始化配置文件 新建文件夹 63&#xff0c;执行 npm init -y 修改配置文件 {"name": "kaimo-http-server","version": "1.0.0","description": "","main": "index.js","keywords"…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(17)-Fiddler如何充当第三者再识AutoResponder标签-下

1.简介 上一篇宏哥主要讲解的一些在电脑端的操作和应用&#xff0c;今天宏哥讲解和分享一下&#xff0c;在移动端的操作和应用。其实移动端和PC端都是一样的操作&#xff0c;按照宏哥前边抓取移动端包设置好&#xff0c;就可以开始实战了。 2.界面功能解析 根据下图图标注位…

AD21 PCB设计的高级应用(四)FPGA的管脚交换功能

&#xff08;四&#xff09;FPGA的管脚交换功能 高速 PCB 设计过程中,涉及的 FPGA等可编程器件管脚繁多,也因此导致布线的烦琐与困难&#xff0c;Altium Designer 可实现 PCB 中 FPGA 的管脚交换&#xff0c;方便走线。 1.FPGA管脚交换的要求 (1)一般情况下,相同电压的 Bank之…

python——案例三:计算三角形面积

案例三&#xff1a;计算三角形面积 afloat(input(输入三角形第一个边的长度:)) #数据导入 bfloat(input(输入三角形第二个边的长度:)) cfloat(input(输入三角形第三个边的长度:)) s(abc)/2 #半周长计算公式 area(s*(s-a)*(s-b)*(s-c))**0.5 #面积公式 print(area) #

多源bfs

这是 LeetCode 上的「1162. 地图分析」 &#xff0c;难度为「中等」。 与「单源最短路」不同&#xff0c;「多源最短路」问题是求从「多个源点」到达「一个/多个汇点」的最短路径。 在实现上&#xff0c;最核心的搜索部分&#xff0c;「多源 BFS」与「单源 BFS」并无区别。 并…

区块链:可验证随机函数

本篇主要介绍可验证随机函数的定义及其在区块链上的作用。 1 可验证随机函数 1.1 定义 可验证随机函数(Verifiable Random Function&#xff0c;VRF)本质上还是一类具有验证功能的伪随机函数。对于一个特定的输入 m m m以及输入者的私钥 S K SK SK&#xff0c;VRF会输出一个随…

Oracle设置某个表字段递增

当Oracle设置字段递增创建触发器 先建一个序列&#xff0c;打开PLSQL 找到Sequences&#xff0c;右击新建 根据自己的需要填写 然后添加触发器&#xff0c;点新建-程序窗口-空白 --TEST_ID为触发器的名字&#xff0c;TEST是添加触发器的表名 CREATE OR REPLACE TRIGGER &qu…

【C++】 哈希

一、哈希的概念及其性质 1.哈希概念 在顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。比如顺序表需要从第一个元素依次向后进行查找&#xff0c;顺序查找时间复杂度为…

【ChatGPT】基于WSL+Docker的ChatGPT PLUS共享服务部署

最近买了ChatGPT PLUS服务&#xff0c;想通过web服务将它共享给其他人使用&#xff0c;搜了一下目前GitHub上比较热门的服务有 ChatGPT-Next-Webchatgpt-web-share 其中chatgpt-web-share支持API和PLUS账号分享两种方式&#xff0c;且架构为PythonJSDocker&#xff0c;相对比…

【EI/SCOPUS会议征稿】第三届检测技术与自动化工程国际学术会议 (TTAE 2023)

第三届检测技术与自动化工程国际学术会议 (TTAE 2023)原定将于2023年9月15-17日在中国西安召开。 检测技术与自动化工程国际学术会议将每年举行一次&#xff0c;旨在将“检测技术”和“自动化工程”等学术领域的学者、专家、研发者、技术人员聚集到一个学术交流的平台&#xf…

docker容器认识及安装(linux系统)

目录 一、Docker概述 容器背景 容器对比传统虚拟化 Docker的使用场景 二、Docker的优点 1、快速的交付和部署 2、更高效的虚拟化 3、更轻松的迁移和扩展 4、简单的管理 三、Docker的核心概念 1、镜像&#xff08;Image&#xff09; 2、容器&#xff08;Container&…

UM2080F32——32位SoC芯片

UM2080F32是基于ARM Cortex-M0内核的超低功耗、高性能的、单片集成(G)FSK/OOK无线收发机的32位SoC芯片。工作于200MHz~960MHz范围内&#xff0c;支持灵活可设的数据包格式&#xff0c;支持自动应答和自动重发功能&#xff0c;支持跳频操作&#xff0c;支持FEC功能&#xff0c;同…

【Lua学习笔记】Lua进阶——垃圾回收

按照唐老师的课程本来要讲自带库的&#xff0c;但是想想这东西能看文档&#xff0c;ctrl左键还能看注解&#xff0c;并且最重要的许多自带库的方法基本大部分语言都有&#xff0c;其实看看就能懂了。所以还是重点讲讲垃圾回收 文章目录 GC辅助垃圾回收collectgarbage增量模式分…

多模态第2篇:MMGCN代码配置

一、Windows环境 1.创建并激活虚拟环境 #创建虚拟环境命名为mmgcn&#xff0c;指定python版本为3.8 conda create -n mmgcn python3.8 #激活虚拟环境 conda activate mmgcn2.安装pytorch #torch2.0.0 cu118 pip install torch2.0.0cu118 torchvision0.15.1cu118 torchaudio…

优维低代码实践:Context / State

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

第六篇:什么是Prometheus Operator

Prometheus Operator简介 Prometheus Operator 是 CoreOS 开发的基于 Prometheus 的 Kubernetes 监控方案&#xff0c;也是目前功能最全面的开源方案。 Prometheus是一个开源的系统监控和报警系统&#xff0c;现在已经加入到CNCF基金会&#xff0c;成为继k8s之后第二个在CNCF…

如何练习笔试中的ACM模式? 这个网站上线了!

7月18日&#xff0c;卡码网 在朋友圈里正式内测&#xff0c;同时也迎来了第一批用户。 经过半个月的不断调试&#xff0c;解决各种问题&#xff0c;现在终于可以正式发布了。 截止发文&#xff0c;卡码网已经迎来了第一千位卡友。 【图片】 卡码网地址&#xff1a;https://k…