前端使用miniO上传文件

news2024/9/21 22:18:56

项目背景:vue2,前提是请先安装miniO,若安装引入时报错,那就是版本不对,通常指定版本安装即可。

页面样式:

前端vue页面代码:

//<el-form>表单中:

              <el-form-item label="文件"  prop="fileIds">
                  <span v-if="showWait">文件上传中,请耐心等待</span>
                  <div v-else>
                    <div v-if="formUpload.urlIllustrate&&formUpload.typeFlag">
                      <input type="file" id="file" @change="uploadFile()" />
                      //实际只需要采纳文件上传输入框就行   其余代码是我的上传校验判断
                    </div>
                    <div @click="ruleUpInfo" v-else>
                      <span style="border:1px solid #000000;padding:4px;background- 
                       color:#EFEFEF;">选择文件</span>
                    </div>
                  </div>
                </el-form-item>

代码中引入minio,并声明配置mini连接

 import * as Minio from 'minio';
  let stream = require('stream')
  //连接minio文件服务器
  var minioClient = new Minio.Client({
    endPoint: 'xxxxxxxxxxxxxx.cn',
    accessKey: 'oooooooooooooo1',
    secretKey: 'cccccccccccccccccccccccc',
    useSSL: false,
    bucketName: 'nnnnnnnnnname' // 存储桶名称
  });

上传事件中:

  //上传文件
    uploadFile(fileObj,index) {
           let vm = this
          let file = document.getElementById('file').files[0];
          this.showWait=true //这是我自己的判断 可删
          console.log('fole',file);
          // 获取当前日期并格式化
          const now = new Date();
          const year = now.getFullYear();
          const month = (now.getMonth() + 1).toString().padStart(2, '0'); 
          const day = now.getDate().toString().padStart(2, '0');
          const formattedDate = `${year}-${month}-${day}`;
          //获取文件类型及大小
          const fileName = `${this.formUpload.typeFlag}/${formattedDate}/${file.name}`
         //文件名拼接日期和数据类型(此处是为了在minio库中看到日期对应的上传文件,所以拼接,按需使用。注意MiniO库中同名文件会被覆盖,所以建议最好加个日期或者定义数据类型之类的区分开)
          const mineType = file.type
          const fileSize = file.size
          //参数
          let metadata = {
            "content-type": mineType,
            "content-length": fileSize
          }
          //判断储存桶是否存在
            //这里nnnnnname改成配置的储存桶名称
          minioClient.bucketExists('nnnnnname', function(err) {
            if (err) {
              if (err.code == 'NoSuchBucket') return console.log("bucket does not 
          exist.")
              return console.log(err)
            }
            //存在
            console.log('Bucket exists.')
            //准备上传
            let reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onloadend = function (e) {//读取完成触发,无论成功或失败
              console.log('读取完成',e);
              const dataurl = e.target.result
              //base64转blob   这里调了下面toBlob方法,不要困惑vm是什么,我前面声明过vm=this 
             指向的哈
              const blob = vm.toBlob(dataurl)
              //blob转arrayBuffer
              let reader2 = new FileReader()
              reader2.readAsArrayBuffer(blob)

              reader2.onload = function(ex) {
                //定义流
                let bufferStream = new stream.PassThrough();
                //将buffer写入
                bufferStream.end(new Buffer(ex.target.result));
                //上传  
               //这里nnnnnname改成配置的储存桶名称
                minioClient.putObject('nnnnnname', fileName, bufferStream, fileSize,                                                     
               metadata, function(err, etag) {
                  console.log('走上传了',etag);
                  if (err == null) {
                     //这里nnnnnname改成配置的储存桶名称
                    minioClient.presignedGetObject('nnnnnname', fileName, 
                    24*60*60, function(err, presignedUrl) {
                      if (err) return console.log(err)
                      //输出url  上传到桶成功后会返回个地址
                      console.log('上传后0',presignedUrl)
                      if(presignedUrl){
                       vm.submitUpload(presignedUrl) //这里按需处理,我是拿到地址后,请求 
                       submitUpload方法,将地址传给后端存了的
                      }
                    })
                  }
                })
              }
            }
          })         
    },
    //base64转blob
    toBlob (base64Data) {
      let byteString = base64Data
      if (base64Data.split(',')[0].indexOf('base64') >= 0) {
        byteString = 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,可以直接使用
      return blob
    },

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

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

相关文章

链表OJ题——反转一个单链表

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 原地翻转链表 二、解题思路 原地翻转链表&#xff0c;空间复杂度为O(1)&#xff0c;时间复杂度O(n) 三、解题代码

亲测好用,吐血整理 ChatGPT 3.5/4.0 新手使用手册~ 【2024 更新】

废话不多说&#xff0c;直接分享正文~ 以下是小编为大家搜集到的最新的ChatGPT国内站&#xff0c;各有优缺点。 1、AI Plus&#xff08;稳定使用&#xff09; 推荐指数&#xff1a;⭐⭐⭐⭐⭐ yixiaai.com 该网站已经稳定运营了1年多了。2023年3月份第一批上线的网…

高速公路边坡在线监测预警系统

一、背景 近日&#xff0c;广东梅大高速发生严重塌方事故&#xff0c;造成了严重的人员伤亡和财产损失。这一事件在公众心中敲响了安全的警钟&#xff0c;再次引起了公众对于交通设施运营安全性的重点关注。 二、系统介绍 高速公路边坡在线监测预警系统通过结合北斗、5G、AI…

jstack结果提取特定线程池线程的堆栈

这里假设你已经知道如何定位java进程PID&#xff0c;以及如何执行jstack命令进行导出&#xff0c;下面仅提供相关命令&#xff0c;及示例 ps aux|grep java jstack 8229 > jstack_output.log v1版本 grep second jstack_output.log 如果此时我们想重点关注一下下面这个线程…

极简接入|七牛云 QPlayer2 播放器再升级

1877 年&#xff0c;爱迪生发明留声机&#xff0c;用锡箔筒捕捉了第一缕声波。随后&#xff0c;黑胶唱片、磁带录音机、八轨盒式磁带机、卡式磁带、激光唱片&#xff08;CD&#xff09;等相继问世。 每一次介质的变革&#xff0c;都带来了音质的提升和便捷性的增强。时光流转&a…

LLM概念梳理(一):训练流程之PT、SFT和PO

一个LLM的成功问世&#xff0c;一般分为&#xff1a;预训练 PT监督微调 SFT偏好优化 PO。 预训练&#xff08;Pre-Training&#xff09;是为了让模型学习通用知识&#xff0c;而监督微调&#xff08;Supervised Fine-Tuning&#xff09;是为了优化模型在特定任务上的表现。为了…

TypeScript学习笔记1---认识ts与js的异同、ts的所有数据类型详解

前言&#xff1a;去年做过几个vue3js的项目&#xff0c;当时考虑到时间问题&#xff0c;js更加熟悉&#xff0c;学习成本低一点&#xff0c;所以只去了解了vue3。最近这段时间补了一下ts的知识点&#xff0c;现今终于有空来码文章了&#xff0c;做个学习总结&#xff0c;方便以…

360驱动大师 v2.0.0.2040 最新免费精简单文件版

360驱动大师是一款专注于驱动安装和更新的专业软件&#xff0c;它拥有庞大的驱动库&#xff0c;能够支持数以百万计的不同类型的驱动程序。 它的设计理念是简化驱动管理和更新的过程&#xff0c;让用户能够轻松地保持系统的最新状态&#xff0c;从而获得更好的性能和稳定性。无…

Linux高编-进程的概念(1)

目录 1.ps aux 2.top 3.kill -2 进程pid // fork函数 getpid拿自己的进程号 getppid拿父进程号 fork&#xff08;&#xff09;&&fork&#xff08;&#xff09;||fork&#xff08;&#xff09; 父子进程的关系&#xff1a; 僵尸进程&#xff0c;孤儿进程 僵…

zookeeper源码分析之事务请求处理

一.参考 zookeeper启动和选举的源码分析参考之前的帖子. 二.源码 1.职责链模式. 每次经过的processor都是异步处理&#xff0c;加入当前processor的队列&#xff0c;然后新的线程从队列里面取出数据处理. PrepRequestProcessor 检查ACL权限,创建ChangeRecord. SyncRequest…

用Python更改Word文档文本的字体

更改文字字体是编辑和美化Word文档时的一项常见需求&#xff0c;使用合适的字体不仅可以提升文档的整体视觉效果&#xff0c;还能突显关键信息&#xff0c;使得内容更加突出。然而&#xff0c;手动更改每一个文字的字体既繁琐又费时。因此&#xff0c;掌握一种高效的方法来自动…

verilog当中仿真的时候赋值用=还是<=

【总结&#xff1a;<是所有数据同时变化&#xff0c;而是顺序执行。如果是左边数据的赋值都是不关联的&#xff0c;那么就可以用<&#xff0c;使所有赋值同时有效。如果有a和b都需要赋值&#xff0c;且b的值跟a有关的同时还需要一起变化&#xff0c;那么可以用】 一般情…

C++ UML 使用 doxygen 生成源码类图

一&#xff1a;安装 sudo apt install doxygensudo apt install doxygen-guisudo apt install graphviz graphviz-doc 二&#xff1a;使用 命令行输入 doxywizard&#xff0c;打开图形界面 参考&#xff1a; https://www.cnblogs.com/guohaoblog/p/15151353.html

探秘:哪些项目需要代理IP来助力?

网络爬虫&#xff1a;数据采集的秘密武器 网络爬虫是互联网世界中的“数据矿工”&#xff0c;它们在网络中不断爬行&#xff0c;采集各种有用的信息。然而&#xff0c;频繁的访问请求很容易引起目标网站的警觉&#xff0c;甚至被封禁。此时&#xff0c;代理IP就像是爬虫的“隐…

Springboot发邮件功能如何实现?详细步骤?

Springboot发邮件配置指南&#xff1f;如何集成Spring Mail发邮件&#xff1f; 无论是用户注册、密码重置还是重要通知的发送&#xff0c;邮件都是不可或缺的沟通方式。Springboot作为一个流行的Java开发框架&#xff0c;提供了简洁易用的方式来实现邮件功能。AokSend将详细探…

LLM的一些基础知识:参数和内存估计

介绍&#xff1a; 基于 Transformer 架构的大型语言模型 (LLM) 已变得越来越普遍。例如&#xff0c;Mistral AI 团队推出了Mistral 7B 模型。了解其推理、微调和训练的内存需求对于高效部署和利用至关重要。 总结&#xff1a; 推理内存估算&#xff1a;对于 70 亿参数模型 (…

安装docker 遇到异常Could not resolve host: mirrorlist.centos.org; 未知的错误

问题 安装docker 遇到异常 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误” 1、安装Docker依赖包 yum install …

机器学习第十二章-计算学习理论

目录 12.1基础知识 12.2 PAC学习 12.3有限假设空间 12.3.1可分情形 12.3.2不可分情形 12.4VC维 12.5 Rademacher复杂度 12.1基础知识 计算学习理论研究的是关于通过"计算"来进行"学习"的理论&#xff0c;即关于机器学习的理论基础&#xff0c;其目的…

数据分析实操案例分享:制造企业如何对订单数据进行BI分析?

提到数据分析&#xff0c;大家可能首先想到的是它在零售行业的应用&#xff0c;它能够助力商家实现精准营销&#xff0c;从而带来盈利。 事实上&#xff0c;数据分析的重要性已经扩展到制造业&#xff0c;它在该行业中的作用日益凸显。它能够帮助生产管理者迅速识别异常&#…

零基础也能看懂的五大网络安全技术,学网络安全真的可以很简单

网络安全技术是保护网络不受未经授权访问、破坏或盗取信息的重要手段。以下是五种零基础也能看懂的网络安全技术&#xff1a; 1.防火墙技术&#xff1a;防火墙是一种网络安全设备&#xff0c;用于监控和控制进入或离开网络的流量。它可以识别不安全的数据包&#xff0c;并阻止…