minio+vue+elementUI,上传文件到服务器,下载到本地,纯VUE版_背砖程序猿的博客-程序员秘密

技术标签: 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

智能推荐

hdfs文件权限问题_<name>dfs.permission</name> <value>false</value>_小C哈哈哈的博客-程序员秘密

可以通过在hdfs-site.xml中添加上dfs.permissions属性来避免hdfs文件权限机制&lt;property&gt;&lt;name&gt;dfs.permissions&lt;/name&gt;&lt;value&gt;false&lt;/value&gt;&lt;/property&gt;设置之后,重新启动hdfs,可以避免hdfs的权限问题,便于开发测试。...

linux下通过vscode+cmake来调试C++代码_vscode cmake 自定义_追B小佬弟的博客-程序员秘密

linux下调试C++是真的神烦,下面纪律下自己用vscode调试代码的步骤。默认vscode写C++使用到的各种插件已经安装上,C++和cmake的语法也都会,不会的先去学。第一步使用vscode打开自己的工程文件夹。像下面这个样子第二步写launch.json按F5进入调试或者Ctral+Shift+D进入调试,选择C++(GDB/LLDB)会自动创建launch.json,主要...

poj 1182 食物链(带权并查集)_黎辰的博客-程序员秘密

题目链接:点击打开链接题目大意:给出一些关系,判断矛盾的个数,先说出的未被反驳的语句我们认为是正确的题目分析:这种题很明显是集合的问题,但是是一个有关系的集合,所以我们可以利用带权的并查集来解决,主要做法如下:我们定义两个数组,第一个数组就是实现并查集的fa数组,用来判断集合关系,把每个集合看做一条链,可以得到这条链的一端,我们定义它为根,因为关系满足传递性,所以我们可

计算机专业研究生复试知识汇总,考研经验:计算机专业考研复试三大注意事项..._Scott Johnson的博客-程序员秘密

1、院校更看重研究生学习能力每个学校计算机专业考研复试情况不尽相同,但主要分为三个部分,即专业课的笔试、面试和英语听力口语测试。在招收研究生的时候,导师通常很看重学生的独立研究学习能力,这一方面是由计算机专业的学科独特性决定的,而且研究生教育又主要是要求学生在研究中学习;另一方面,也是因为目前应试教育的泛滥,单纯的专业性、技术性复试不能全面反映学生的能力。所以在复试时通常倾向于以综合性的题目为主,...

获取手机验证码——Vant表单验证/后端框架express/前后端交互_vant 获取验证码_yugioo的博客-程序员秘密

完成一个获取手机验证码的功能,在获取之前要对手机号进行表单验证,判断是否输入/输入的是否为正确格式,获取手机验证码后可等待n秒重新获取,代码如下:&lt;template&gt; &lt;div class="login container"&gt; &lt;Header&gt;&lt;/Header&gt; &lt;section&gt; &lt;van-form ref="form" @submit="onSubmit"&gt;

进入 IT 企业必读的Java面试题合集,强烈建议收藏!_java8797的博客-程序员秘密

说起要找工作了,你觉得此刻最该做的事情是什么?当然是找个大厂的面试题看一下套路;今天小编分享给大家一些Java面试题;欢迎阅读!更多2021最新Java面试题全部答案及Java零基础入门教程资料都已经给大家整理好了,大家需要的可以自行下载:Java考试_Java笔试题机试题真题讲解_JavaWeb阶段考试_Java期末考试通关_Java程序员面试题Java300集零基础适合初学者视频教程_Java300集零基础教程_Java初学入门视频基础巩固教程设计模式1.请写出您

随便推点

Spring Boot + Spring Security Oauth2 捕获UsernameNotFoundException 并处理_Return_Code的博客-程序员秘密

在网上找了不少关于UsernameNotFoundException捕获的帖子,捕获成功后每次用户名错误会在控制台打印大段的异常信息,用统一异常处理也无法处理。配置捕获UsernameNotFoundException,在 WebSecurityConfigurer 配置provider.setHideUserNotFoundExceptions(false) @Bean public DaoAuthenticationProvider authenticationProvid..

STM32 之二 HAL库详解 及 手动移植_hal_adc_stop_dma_oshan2012的博客-程序员秘密

2018.1.19 更新其中的错误部分HAL库结构  说到STM32的HAL库,就不得不提STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间。STM32CubeMX就是以HAL库为基础的,且目前仅支持HAL库及LL库!首先看一下,官方给出的HAL库的包含结构:- **stm32f2xx.h**主要包含STM32同系列芯片的不同具体型号的定义,是否使...

k8s 1.24 及以后版本如何对接 docker_k8s对应docker版本_muyige0852的博客-程序员秘密

关注 k8s 的小伙伴门都知道在 k8s 1.24 版 dockershim 代码正式的从 k8s 移除了。这也就意味着k8s 与 docker 的对接再也不像以前那么丝滑了。这篇文档记录一下我在使用 docker 作为 CRI 插件时部署 k8s 的步骤。我依然借助 kubeadm 来部署 k8s,关于 kubeadm 的使用可以参考我前面的文档,和这篇文档重复的步骤我就不在这儿写了,我们只关注和 docker 相关的部分。............

2017年08月31日训练日记_菜圾的博客-程序员秘密

开学已有好几天,最近没有敲代码,今天比了一场赛,因为下午满课,就做了1个小时,感觉倒是没有手生,就是一个题都没有做出来,之前的树状数组专题已经结束,最近计划是看线段树的资料,接下来时间要尽量看线段树的资料,迎接线段树的专题。有空课的时候尽量多去实验室,既然是在有其他课业的同时时学习ACM,固然是与集训不同的,主要就是时间问题,那么学习ACM的时间其实主要就是课余时间,前面这几周课比较满,空下来的时

黑客和小白_黑客与小白_jorden18的博客-程序员秘密

黑客:我控制了你的电脑 小白:怎么控制的? 黑客:用木马 小白:……在哪里?我为什么看不见? 黑客:打开你的任务管理器 小白:“我的电脑”里没有啊 黑客:算了,当我什么也没做过 黑客:我已经控制了你的电脑 小白:哦 黑客:害怕了吧?!嘿嘿 小白:来的正好,帮我杀杀毒吧,最近我的机子毛病很多耶 黑客:…… 小白:你怎么总是在我的电脑里随便进进出出? 黑客:你可以装防火墙 小白:装防火墙,你就不能进入

Eclipse+SSM各种小问题汇总(我所遇见的)(持续更新)_轨迹丶的博客-程序员秘密

1、problems出现:Target runtime com.genuitec.runtime.generic解决方法: 参考文章:传送门2、Console报错:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet解决方法: 参考文章:传送门如果已有Maven

推荐文章

热门文章

相关标签