前端使用miniO上传文件

embedded/2024/9/23 2:26:38/

项目背景: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 = thislet 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.typeconst 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转arrayBufferlet 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转blobtoBlob (base64Data) {let byteString = base64Dataif (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)}// 生成blobconst blob = new Blob([uintArr], {type: mimeString})// 使用 Blob 创建一个指向类型化数组的URL, URL.createObjectURL是new Blob文件的方法,可以 生成一个普通的url,可以直接使用return blob},


http://www.ppmy.cn/embedded/98520.html

相关文章

尚品汇-前端面包屑平台属性、排序处理(三十三)

目录&#xff1a; &#xff08;1&#xff09;面包屑处理平台属性 &#xff08;2&#xff09;排序处理 &#xff08;2&#xff09;单点登录业务介绍 &#xff08;1&#xff09;面包屑处理平台属性 前端显示&#xff1a;面包屑显示效果 搜list搜索方法继续添加返回的平台属性…

vue 列表无限滚动列表,循环完自动切换tab

记录一下大屏常用的滚动组件 vue-seamless-scroll 以及滚动完自动切换tab效果。 1.下载vue-seamless-scroll插件 npm install vue-seamless-scroll --save 2.页面使用 <vueSeamlessScroll ScrollEnd"changeScroll" :data"nowlist" :class-option&quo…

合并两个有序链表--力扣

题目如下: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例如下: 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 …

VSCode配置ssh免密连接远程服务器

我配置了免密设置(Windows利用ssh免密码登录Linux)&#xff0c;git bash已经能够正常连接了&#xff0c;但是vscode还是不行&#xff0c;很奇怪。 VSCode报错信息&#xff1a; [17:55:50.360] SSH Resolver called for "ssh-remote106.52.2.19", attempt 5, (Recon…

VAuditDemo常规漏洞

VAuditDemo常规漏洞 一、留言类功能漏洞 messageDetail.php - 存在数字型SQL注入&#xff0c;反射型XSS SQL注入 sqlwaf修改措施 反射型XSS messageSub.php search.php - 存在反射型xss 二、用户操作类漏洞 1、登录功能 logCheck.php - 空验证码绕过漏洞 2、编辑用户信息类 upd…

人脸识别设计

总体思路 人脸识别使用的算法思路为&#xff1a;首先&#xff0c;定位一张图像中所有的人脸位置&#xff1b;其次&#xff0c;对于同一张脸&#xff0c;当光线改变或者朝向方位改变时&#xff0c;算法还能判断是同一张脸&#xff1b;然后找到每一张脸不同于其他脸的独特之处&a…

学生党运动耳机推荐都有哪些?五大适合学生党使用的运动耳机推荐

在天气比较舒适的时候&#xff0c;不少朋友喜欢骑车出行了&#xff0c;我自己没事也喜欢去公园散步、骑车&#xff0c;外出途中有音乐相伴那是最好不过了。我使用过降噪耳机、骨传导耳机、传统入耳式有线耳机等&#xff0c;各种耳机的使用体验差异相差不大&#xff0c;不过有一…

salesforce如何导出字段名称和api name的对应关系

在 Salesforce 中&#xff0c;如果你想导出某个对象的字段名称及其对应的 API 名称&#xff0c;你可以通过以下几种方法来实现&#xff1a; 方法一&#xff1a;使用 Salesforce Schema Builder 打开 Schema Builder: 进入 Salesforce 后&#xff0c;导航到 Setup&#xff08;设…