首页 > 其他分享 >vue + minio上传文件服务器

vue + minio上传文件服务器

时间:2024-10-15 11:01:26浏览次数:1  
标签:vue const minio base64Data let blob new 上传

1、安装依赖

npm install minio-js
npm install stream

2、vue组件中引入

import { Minio } from "minio-js";

3、初始化minio插件

initMinio() {
  this.minioClient = new Minio.Client({
    endPoint: 'xxx.xxx.x.xx', // MinIO服务器地址
    port: 59000, // 端口号
    useSSL: false, // 是否使用SSL
    accessKey: 'xxxxxxxxx', // 登录的accessKey
    secretKey: 'xxxxxxxxx', // secretKey  
});
}

4、上传逻辑

uploadFiles(options) {
  const stream = require("stream");
  const file = options["file"];
  const fileDate = new Date().getTime();
  let that = this;
  //判断储存桶是否存在
  this.minioClient.bucketExists(this.bucketName, (err) => {
    if (err) {
      if (err.code == "NoSuchBucket")
        return console.log("bucket does not exist.");
      return console.log(err);
    }
    //准备上传
    let reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onloadend = (e) => {
      //读取完成触发,无论成功或失败
      const dataurl = e.target.result;
      //base64转blob
      const blob = that.toBlob(dataurl);
      //blob转arrayBuffer
      let reader2 = new FileReader();
      reader2.readAsArrayBuffer(blob);
      reader2.onload = (ex) => {
        //定义流
        let bufferStream = new stream.PassThrough();
        //将buffer写入

        bufferStream.end(Buffer.from(ex.target.result));
        //上传
        that.minioClient.putObject(
          this.bucketName,
          `test/${fileDate}${file.name}`,
          bufferStream,
          file.size,
          (err, etag) => {
            if (err == null) {
         that.$message({message: '上传成功', type: 'success'});
         console.log('上传成功路径:', `http://${this.ip}:${this.port}/${this.bucketName}/test/${fileDate}${file.name}`);
            }
          }
        );
      };
    };
  });
},
// 转blob格式
toBlob(base64Data) {
  let byteString = base64Data;
  if (base64Data.split(",")[0].indexOf("base64") >= 0) {
    byteString = window.atob(base64Data.split(",")[1]); // base64 解码
  } else {
    byteString = unescape(base64Data.split(",")[1]);
  }
  // 获取文件类型
  let mimeString = base64Data.split(";")[0].split(":")[1]; // mime类型
  let uintArr = new Uint8Array(byteString.length); // 创建视图

  for (let i = 0; i < byteString.length; i++) {
    uintArr[i] = byteString.charCodeAt(i);
  }
  // 生成blob
  const blob = new Blob([uintArr], {
    type: mimeString,
  });
  // 使用 Blob 创建一个指向类型化数组的URL, URL.createObjectURL是new Blob文件的方法,可以生成一个普通的url,可以直接使用,比如用在img.src上
  return blob;
},

5、vue中使用上传组件

<el-upload
  class="upload-demo"
  ref="upload"
  action="#"
  :show-file-list="false"
  multiple
  :http-request="uploadFiles"
>
  <el-button slot="trigger" size="mini" type="primary">打开多个文件</el-button>
</el-upload>

 

标签:vue,const,minio,base64Data,let,blob,new,上传
From: https://www.cnblogs.com/bella99/p/18467005

相关文章

  • 微信小程序-文件上传功能
    WXML文件:<!--pages/picture/picture.wxml--><text>pages/picture/picture.wxml</text><buttonbindtap="ChooseImageFile">选择图片(以File形式存储在39)</button>JS文件://39File形式上传ChooseImageFile(){wx.chooseImage({......
  • Vue组件及组件化:深入解析与组件生命周期
    Vue组件及组件化:深入解析与组件生命周期Vue.js作为一款渐进式JavaScript框架,凭借其易用性、灵活性和高性能,在前端开发领域占据了一席之地。其中,组件化开发是Vue.js的核心特性之一,它极大地提高了代码的可复用性、可维护性和可测试性。本文将深入解析Vue组件及组件化的概念,并......
  • uniapp(vue)打包web项目页面刷新后报404解决方案
    一、问题概述uniapp是一款优秀的跨平台开发框架,它可以帮助开发者快速构建出适用于多端的应用程序。然而,在项目打包后,有可能发现页面在刷新时会出现404错误。这无疑给用户体验带来了极大的困扰,下面我们就来分析一下这个问题。二、原因分析路由配置问题:uniapp项目采用Vue路由......
  • 基于SpringBoot+vue的社区流浪动物救助系统(源码+文档+部署讲解等)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • 怎么修改网站内容怎么修改网站内容后上传到网页上
    要修改网站内容并上传到网页上,你可以按照以下步骤操作:获取网站源码:如果你有网站的源代码,可以直接进行下一步。如果没有源代码,需要从服务器或版本控制系统(如Git)下载最新的源代码。编辑网站文件:使用文本编辑器(如VSCode,SublimeText)打开网站的HTML、CSS、JavaScript等......
  • springboot+vue基于springboot的德庄火锅店管理系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在当今信息化快速发展的时代,餐饮行业的竞争日益激烈,火锅店作为餐饮行业的重要分支,其管理效率和服务质量直接关系到企业的生存和发展。德庄火锅店作为一家知名的火锅连锁品牌,面临着顾客需求多样化、管理复杂化等挑战。传统的人工管理方......
  • 对vue响应式数据的理解(vue基础,面试,源码级讲解)
    首先我们要知道哪些数据可以劫持。  是否可以劫持:在JavaScript等动态语言中,字符串和数字虽然是基本数据类型(也称为原始数据类型),但它们可以包装成对象(如String对象和Number对象)进行处理。当它们被包装成对象后,就可以使用对象的方法,包括Object.defineProperty等方法进行数据......
  • Vue3 路由(上)
    路由器两种模式history模式:constrouter=CreateRouter({history:createWebHistory(),//history模式})优点:url更加美观,不带有#,更接近传统网站的url缺点:后期项目上限,需要配合服务端处理路径问题,否则刷新会404错误hash模式:constrouter=CreateRouter({histor......
  • vue中如何检测数组变化(vue基础,面试,源码级讲解)
    大家有什么不明白的地方可以分享在评论区,大家一起探讨哦~~(如果对数据劫持还有所不明白的小伙伴,可以去看看上一篇文章哦)在vue2中,是如何对数组进行劫持的呢?简单代码实现: 在vue2中,不会对数组的每一项数据进行递归Object.defineProperty()方法劫持,这样是很浪费性能的。而......
  • Vue 3 和 TypeScript 项目中使用 i18n
    在Vue3和TypeScript项目中使用i18n(国际化)可以通过vue-i18n插件来实现。步骤1:安装依赖首先,你需要安装vue-i18n:npminstallvue-i18n步骤2:创建语言文件在项目中创建一个文件夹(如src/i18n),并在其中创建语言文件。比如,创建en.json和zh.json:src/i18n/en.json{......