minio+vue+elementUI,上传文件到服务器,下载到本地,纯VUE版_vue获取minio文件-程序员宅基地

技术标签: vue  elementui  js  

界面:

 

这个是纯vue版 

< template >段

<!-- 新增信息template -->
<template>
  <div style="float:left;margin:5px 5px">
    <el-button @click="getFileName"  type="success">选择文件</el-button>
  
   <div style="float:left;margin:5px 5px">
    <ul class="uploadFileList">
      <li v-for="item,index of fileList" :key="index">
        <span class="subString">{
   {item.name}}</span>&nbsp;
        <span>({
   {(item.size/1024/1024).toFixed(5)}}M)</span>
        <div class="floatRight" style="float: right;">
          <i class="el-icon-close" style="cursor: pointer;" @click="deleteMinioFile(index)"></i>
        </div>
      </li>
    </ul>
    </div>
    <input type="file" multiple="multiple" id="minIoFile" ref="minIoFile" v-show="false" @change="getFile">
    <el-button v-if="fileList.length>0" type="success" @click="upload" >上传</el-button>
    
    

   <div style="float:left;margin:5px 5px">

    <ul>
      <li v-for="item,index of urlList" :key="index">
        <span @click="downLoad(item.url,item.name)">{
   {item.name}}

        </span>

                <input type="button" @click="downLoad(item.url,item.name)"  value="下载" />


      </li>
     
    </ul>
   </div>
  </div>
</template>

<script>

<script>
/**
  Auth: Lei.j1ang
  Created: 2018/1/19-14:54
*/
import { selectMesAdviceList, importExl, getDetails, saveMesPlan } from '@/api/plan/mesAdivce'
import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
import waves from '@/directive/waves' // 水波纹指令


let Minio = require('minio')
let stream = require('stream')
//连接minio文件服务器
var minioClient = new Minio.Client({
    endPoint: '192.168.0.101',   //对象存储服务的URL
    port: 9000,//端口号
    useSSL: false,   //true代表使用HTTPS
    accessKey: 'minioadmin',   //账户id
    secretKey: 'minioadmin',   //密码
    partSize: '50M'
});
export default {
  name: 'MesAdivce',
  components: { Pagination },
  directives: {
    waves
  },
  data: () => ({
    fileListUpload: [],
    limitUpload: 3,
    excelList: [],
     fileList:[],
      urlList:[],
    mesAdviceList: [],
    mesAdviceDetailList: [],
    dialogVisible: false,
    detailsVisible: false,
    dialogFormVisible: false,
    total: 0,
    parameterDto: {
      startTime: '',
      endTime: '',
      current: 1,
      size: 10
    },
    submitForm: {
      planCode: '',
      steelCode: '',
      steelType: '',
      dxfCode: '',
      dxfModel: '',
      dxfUrl: '',
      cutUrl: ''
    }
  }),
  created() {
    this.loadPageTableList()
  },
  methods: {

downLoad(filename,names){

      var x=new XMLHttpRequest();
      var resourceUrl = filename
      x.open("GET", resourceUrl, true);
      x.responseType = 'blob';
      x.onload=function(e){
        // ie10+
        if (navigator.msSaveBlob) {
          var name = resourceUrl.substr(resourceUrl.lastIndexOf("/") + 1);
          return navigator.msSaveBlob(x.response, name);
        } else {
          var url = window.URL.createObjectURL(x.response)
          var a = document.createElement('a');
          a.href = url;
          a.download = names;
          a.click();
        }
      }
      x.send();

    },
    upload(){
      console.log(this.fileList);
      this.fileList.map((item,index) => {
        console.log(item);
        this.uploadMinIo(item,index);
      })
      // console.log(this.fileList);
    },
    deleteMinioFile(index){
      this.fileList.splice(index,1)
    },
    getFileName(){
      let inputDOM = this.$refs.minIoFile;
      inputDOM.click();
    },
    getFile(event){
      console.log(event);
      console.log(document.getElementById('minIoFile').files);
      let files = document.getElementById('minIoFile').files;
      let arr = [];
      let fileSwitch = true;
      if(files.length > 0){
        for(let i = 0;i<files.length;i++){
          if((files[i].size/1024/1024).toFixed(5)>64){
            this.$message({
              message: `${item.name}超过文件的最大长度`,
              type: 'warning'
            });
            fileSwitch = false;
          }
        }
        if(fileSwitch){

          for(let i = 0;i<files.length;i++){
            console.log(files[i]);
             if((files[i].type=='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
             || (files[i].type == 'application/vnd.ms-excel')
             || (files[i].type == 'text/plain')
             || (files[i].type == 'image/png')
             || (files[i].type == 'image/gif')
             || (files[i].type == 'image/jpg')
             || (files[i].type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')
             || (files[i].type == 'application/vnd.openxmlformats-officedocument.presentationml.presentation')
             ){
              this.fileList.push(files[i])
             }else{
               console.log("类型不对");
             }
           
          }
          console.log(this.fileList);
        }
      }
    },
    //上传文件
    uploadMinIo(fileObj,index) {
     this.fileList=this.fileList.filter((self,el)=>{
       return self != fileObj
     })
      let vm = this
      // const files = fileObj;
      if (fileObj) {
        let file = fileObj
        //判断是否选择了文件
        if (file == undefined) {
          //未选择
          console.log("请上传文件")
        } else {
          //选择
          //获取文件类型及大小
          const fileName = file.name
          const mineType = file.type
          const fileSize = file.size

          //参数
          let metadata = {
            "content-type": mineType,
            "content-length": fileSize
          }
          //判断储存桶是否存在
          minioClient.bucketExists('img', 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
              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));
                //上传
                minioClient.putObject('img', fileName, bufferStream, fileSize, metadata, function(err, etag) {
                  console.log(etag);
                  if (err == null) {
                    minioClient.presignedGetObject('img', fileName, 24*60*60, function(err, presignedUrl) {
                      if (err) return console.log(err)
                      //输出url
                      console.log(presignedUrl)
                      var only = {url:presignedUrl,name:fileName}
                      console.log(only);
                      vm.urlList.push(only)
                      // window.open(presignedUrl)
                      // this.$notify({
                      //   title: '标题名称',
                      //   message: h('i', { style: 'color: teal'}, '这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案')
                      // });
                    })
                  }
                  //return console.log(err, etag)
                })
              }
            }
          })
        }

      }
    },
    //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类型

      // ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区
      // let arrayBuffer = new ArrayBuffer(byteString.length) // 创建缓冲数组
      // let uintArr = new Uint8Array(arrayBuffer) // 创建视图

      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
  
  },

前后端实现代码如下

vue+springboot 用formdata实现方法详情:

vue实现文件上传,FormData传入后台_背砖程序猿的博客-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40154329/article/details/119041437

智能推荐

Oracle备份的几种方式_oracle数据库备份-程序员宅基地

文章浏览阅读1.2w次,点赞17次,收藏106次。Oracle备份的几种方式这里使用Oracle 12C来大概演示说明一下rman的基本用法,这里不会深入讨论,因为本人也只是刚刚才接触,只是结合了网上的一些文章以及自己的实践来总结并拿出来大家学习,谢谢目录一、关于备份与恢复二、逻辑备份(expdp和impdp)三、物理备份四、数据库日常备份计划及脚本参考一、关于备份与恢复1、备份定义备份就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库副本的磁带或磁盘。通常也将存放于转储设备中的数据库的副本称为原数据库的备份或转储。备_oracle数据库备份

android手机连接windows,Windows PC连接Android adb shell的方法-程序员宅基地

文章浏览阅读630次。今天突发奇想,想用跟笔记本连接的键鼠操作自己的安卓设备(具体操作先挖个坑之后再填)。首先遇到的问题就是,如何用Windows PC连接自己的安卓设备,因为笔者的笔记本的USB接口有限,又有多部安卓设备,还想同时对多部Android设备进行调试,以下是探索到方法:一、查看Windows的环境变量:win徽标键+R 打开运行框键入cmd 打开命令指示符echo %PATH%..._windows usb android 命令

Android Studio查看签名文件sha1和MD5的方法_黄油sha1-程序员宅基地

文章浏览阅读6.2k次。android在生成了应用签名文件后,如果我们想要查看签名文件的sha1和md5,该怎么操作呢??下面我们来看看。 把android studio界面左下角的Terminal终端窗口打开,进入JDK的bin目录,因为Terminal默认的路径是从android studio安装的那个盘开始,所以要自己手动操作,进入到jdk安装目录下的bin文件夹下,在这里我的android studio安装目_黄油sha1

有弹性的ScrollView_setmovefactor-程序员宅基地

文章浏览阅读1.1k次。我是个新手,虽然说现在这已经算是过时的效果,但是我还是要学会到底是怎么实现的,于是我把我之前看到的,别人实现的半成品,拿过来搞懂了之后,复写了一遍,然后添加了可以左右弹性移动的部分。然后添加了几个getter/setterimport android.content.Context;import android.graphics.Rect;import android.view.Motio_setmovefactor

WPS2017 电子表格/Excel文件保护密码忘记了?_wps表格忘记密码 怎么取消工作表保护-程序员宅基地

文章浏览阅读1.9w次,点赞5次,收藏19次。WPS2017 电子表格/Excel文件保护密码忘记了?废话不说,直入正题。妹妹有一个考勤表格的保护密码忘记了,要发上个月工资了,着急坏了,求助万能的老哥!隐约记得密码有10来位,不是数字,在着急用的前提下使用工具暴力破解密码完全来不及。想了一下,Excel文件的保密密码应该是使用弱加密算法直接保存在文件中的,想了两个办法:1、使用16进制编辑器,查接查看Excel文件_wps表格忘记密码 怎么取消工作表保护

战神Z7闪屏暗屏问题解决,战神Z7-KP7GC(其他也许也有)_神舟战神z7mkp7gc屏幕暗-程序员宅基地

文章浏览阅读5.7k次。神州笔记本性价比确实不错,但是问题也会有很多,特别不适合不太懂电脑的。直接主题:**主要问题就是:屏幕一直暗亮,暗亮,闪的很快。调节亮度到最低或者倒数第二档会没事,但是调高之后要么会突然变暗不闪,要么就是开始闪屏,总是不能把亮度调高。**没用多久的战神,突然就还是暗屏,闪屏,黑屏。就是调节亮度也不行,只能把亮度调到最暗,才不会闪屏,但是那么暗看不见啊!!!!!解决过程:我以前尝试拆机查..._神舟战神z7mkp7gc屏幕暗

随便推点

基于MRTK的HoloLens开发(1)_mrtk项目报告-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏16次。基于MRTK的HoloLens开发(1)Hololens开发环境配置Visual Studio具体配置MRTK 工具包配置Unity配置如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流..._mrtk项目报告

最新VMware虚拟机安装Linux系统-CentOS(详细教程)_vmware liunx centeros-程序员宅基地

文章浏览阅读985次,点赞24次,收藏16次。最近有网友反应初学Linx不会安装,找了许多教程不是太全面,总会遇到一些要不是启动不了,要不是连不上网,各种问题,为了让大家能够顺利的安装,小乐写了一个非常详细的教程,让大家少入坑。_vmware liunx centeros

C语言系列文章 | 初识C语言-程序员宅基地

文章浏览阅读940次,点赞39次,收藏29次。在VS上写代码,我们是需要创建项目的,直接新建项目就可以了。在项目中就可以添加源文件和头文件C语言把 .c 为后缀的文件称为源文件,把 .h 为后缀的文件称为头文件。C语言中有一批保留的名字的符号,比如:int、if、这些符号被称为保留字或者return关键字。关键字都有特殊的意义,是保留给C语言使用的程序员自己在创建标识符的时候是不能和关键字重复的关键字也是不能自己创建的。注:在C99标准中加⼊了inlinerestrict、 _Bool 、_Comploex_Imaginary。

java抽象类和接口总结-程序员宅基地

文章浏览阅读133次。一、抽象类二、接口三、抽象类和接口的区别一、抽象类在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abstract void fun();  抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abs..._java抽象类与接口实验报告总结

linux I2C 驱动之----i2c驱动的注册过程(i2c_register_driver->driver_register(&driver->driver)->driver_find)_i2c_board_info 地址-程序员宅基地

文章浏览阅读1.4w次。Linux下i2c驱动的加载过程,分为i2c设备层、i2c adapter层与i2c核心层i2c设备驱动层也就是我们为特定i2c设备编写的驱动,下面是我自己理解的i2c驱动的注册过程在我们写的i2c设备驱动中,我们会调用i2c_add_driver()开始i2c设备驱动的注册,该函数调用i2c_register_driver完成所有注册操作static inline int i_i2c_board_info 地址

execlp使用例子_linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用...-程序员宅基地

文章浏览阅读243次。本节目标: exec替换进程映像exec关联函数组(execl、execlp、execle、execv、execvp)一,exec替换进程映像在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进..._创建进程;在父进程中输出entering main process---;在子进程中使用execl()函数调

推荐文章

热门文章

相关标签