js端minio+vue+elementUI上傳文件,增加文件類型,文件大小及數(shù)量,多文件上傳問(wèn)題

查看minio官網(wǎng),看到minio可以應(yīng)用在不同的環(huán)境下,這里著重講一下minio的js版,并在vue中運(yùn)行,并且增加上傳文件,增加文件類型,文件大小及數(shù)量,多文件上傳的需求

直接上代碼
首先在vue安裝minio

npm install --save minio

簡(jiǎn)單的講解一下代碼,本身minio是沒(méi)有文件類型篩選,文件大小和數(shù)量以及多文件這些功能;
這些其實(shí)是在input上實(shí)現(xiàn)的;

 <input accept=".pdf,.doc" type="file" multiple="multiple" id="minIoFile" ref="minIoFile" v-show="false" @change="getFile">

文件類型是通過(guò)accept限制的;
多選文件是multiple;
文件大小和數(shù)量是通過(guò)其中的方法getFile實(shí)現(xiàn)的

然后強(qiáng)調(diào)一下minioClient,accessKey和secretKey是你登錄minio的用戶名和密碼 ;

然后直接上代碼

<template>
  <div class="minioBox">
    <el-button style="marginRight:10px;" @click="getFileName" size="mini" type="success">選擇文件</el-button>
    <input accept=".pdf,.doc" type="file" multiple="multiple" id="minIoFile" ref="minIoFile" v-show="false" @change="getFile">
    <el-button v-if="fileList.length>0" style="marginRight:10px;" @click="upload" size="mini" type="success">上傳</el-button>
    <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(2)}}M)</span>
        <div class="floatRight" style="float: right;">
          <i class="el-icon-close" style="cursor: pointer;" @click="deleteMinioFile(index)"></i>
        </div>
      </li>
    </ul>
  </div>
</template>
<script>
let Minio = require('minio')
let stream = require('stream')
//連接minio文件服務(wù)器
var minioClient = new Minio.Client({
    endPoint: '',   //對(duì)象存儲(chǔ)服務(wù)的URL
    port: 9001,//端口號(hào)
    useSSL: false,   //true代表使用HTTPS
    accessKey: '',   //賬戶id
    secretKey: '',   //密碼
    partSize: '20M'
});
export default {
  data(){
    return{
      fileList:[],
    }
  },
  methods: {
    upload(){
      this.fileList.map((item,index) => {
        this.uploadMinIo(item,index);
      })
    },
    deleteMinioFile(index){
      this.fileList.splice(index,1)
    },
    getFileName(){
      let inputDOM = this.$refs.minIoFile;
      inputDOM.click();
    },
    getFile(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(2)>64){
            this.$message({
              message: `${item.name}超過(guò)文件的最大長(zhǎng)度`,
              type: 'warning'
            });
            fileSwitch = false;
          }
        }
        if(fileSwitch){
          for(let i = 0;i<files.length;i++){
            console.log(files[i][File]);
            this.fileList.push(files[i])
          }
        }
      }
    },
    //上傳文件
    uploadMinIo(fileObj,index) {
      let vm = this
      // const files = fileObj;
      if (fileObj) {
        let file = fileObj
        //判斷是否選擇了文件
        if (file == undefined) {
          //未選擇
          console.log("請(qǐng)上傳文件")
        } else {
          //選擇
          //獲取文件類型及大小
          const fileName = file.name
          const mineType = file.type
          const fileSize = file.size

          //參數(shù)
          let metadata = {
            "content-type": mineType,
            "content-length": fileSize
          }
          //判斷儲(chǔ)存桶是否存在
          minioClient.bucketExists('testfile', function(err) {
            if (err) {
              if (err.code == 'NoSuchBucket') return console.log("bucket does not exist.")
              return console.log(err)
            }
            //存在
            console.log('Bucket exists.')
            //準(zhǔn)備上傳
            let reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onloadend = function (e) {
              const dataurl = e.target.result
              //base64轉(zhuǎn)blob
              const blob = vm.toBlob(dataurl)
              //blob轉(zhuǎn)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('testfile', fileName, bufferStream, fileSize, metadata, function(err, etag) {
                  if (err == null) {
                    minioClient.presignedGetObject('testfile', fileName, 24*60*60, function(err, presignedUrl) {
                      if (err) return console.log(err)
                      //輸出url
                      console.log(presignedUrl)
                      // this.$notify({
                      //   title: '標(biāo)題名稱',
                      //   message: h('i', { style: 'color: teal'}, '這是提示文案這是提示文案這是提示文案這是提示文案這是提示文案這是提示文案這是提示文案這是提示文案')
                      // });
                    })
                  }
                  //return console.log(err, etag)
                })
              }
            }
          })
        }

      }
    },
    //base64轉(zhuǎn)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 對(duì)象用來(lái)表示通用的开呐、固定長(zhǎng)度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)
      // let arrayBuffer = new ArrayBuffer(byteString.length) // 創(chuàng)建緩沖數(shù)組
      // let uintArr = new Uint8Array(arrayBuffer) // 創(chuàng)建視圖

      let uintArr = new Uint8Array(byteString.length) // 創(chuàng)建視圖

      for (let i = 0; i < byteString.length; i++) {
        uintArr[i] = byteString.charCodeAt(i)
      }
      // 生成blob
      const blob = new Blob([uintArr], {
        type: mimeString
      })
      // 使用 Blob 創(chuàng)建一個(gè)指向類型化數(shù)組的URL, URL.createObjectURL是new Blob文件的方法,可以生成一個(gè)普通的url,可以直接使用,比如用在img.src上
      return blob
    }
  }
}
</script>
<style lang="scss" scoped>
.minioBox{
  color: #000000;
  padding: 10px;
  width: 90%;
  .uploadFileList {
    width: 100%;
    li {
      height: 22px;
      line-height: 22px;
      margin: 10px 0px;
      span {
        margin-right: 10px;
        vertical-align: top;
      }
      .subString {
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 53%;
        display: inline-block;
      }
      i {
        margin: 5px 5px 0 0;
      }
      .el-icon-close,
      .el-icon-upload-success {
        float: right;
      }
      .upload-success {
        color: green;
      }
      .upload-fail {
        color: red;
      }
    }
    li:hover {
      background-color: #f5f7fa;
    }
    li:first-child {
      margin-top: 10px;
    }
    /deep/ .progress {
      margin-top: 2px;
      width: 200px;
      height: 14px;
      margin-bottom: 10px;
      overflow: hidden;
      background-color: #f5f5f5;
      border-radius: 4px;
      -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
      box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
      display: inline-block;
      .progress-bar {
        background-color: rgb(92, 184, 92);
        background-image: linear-gradient(
          45deg,
          rgba(255, 255, 255, 0.14902) 25%,
          transparent 25%,
          transparent 50%,
          rgba(255, 255, 255, 0.14902) 50%,
          rgba(255, 255, 255, 0.14902) 75%,
          transparent 75%,
          transparent
        );
        background-size: 40px 40px;
        box-shadow: rgba(0, 0, 0, 0.14902) 0px -1px 0px 0px inset;
        box-sizing: border-box;
        color: rgb(255, 255, 255);
        display: block;
        float: left;
        font-size: 12px;
        height: 20px;
        line-height: 20px;
        text-align: center;
        transition-delay: 0s;
        transition-duration: 0.6s;
        transition-property: width;
        transition-timing-function: ease;
        width: 266.188px;
      }
    }
  }
}
</style>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怔匣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汪厨,更是在濱河造成了極大的恐慌仓犬,老刑警劉巖锰镀,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兄纺,死亡現(xiàn)場(chǎng)離奇詭異废菱,居然都是意外死亡技矮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門昙啄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)穆役,“玉大人,你說(shuō)我怎么就攤上這事梳凛」⒈遥” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵韧拒,是天一觀的道長(zhǎng)淹接。 經(jīng)常有香客問(wèn)我,道長(zhǎng)叛溢,這世上最難降的妖魔是什么塑悼? 我笑而不...
    開(kāi)封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮楷掉,結(jié)果婚禮上厢蒜,老公的妹妹穿的比我還像新娘。我一直安慰自己烹植,他們只是感情好斑鸦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著草雕,像睡著了一般巷屿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墩虹,一...
    開(kāi)封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天嘱巾,我揣著相機(jī)與錄音,去河邊找鬼诫钓。 笑死旬昭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菌湃。 我是一名探鬼主播稳懒,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了场梆?” 一聲冷哼從身側(cè)響起墅冷,我...
    開(kāi)封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎或油,沒(méi)想到半個(gè)月后寞忿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顶岸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年腔彰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辖佣。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霹抛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卷谈,到底是詐尸還是另有隱情杯拐,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布世蔗,位于F島的核電站端逼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏污淋。R本人自食惡果不足惜顶滩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寸爆。 院中可真熱鬧礁鲁,春花似錦、人聲如沸赁豆。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)歌憨。三九已至,卻和暖如春墩衙,著一層夾襖步出監(jiān)牢的瞬間务嫡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工漆改, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留心铃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓挫剑,卻偏偏與公主長(zhǎng)得像去扣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子樊破,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354