vue項(xiàng)目實(shí)現(xiàn)文件拖拽上傳

一,基本界面

<template>
  <div>
    <div style="width: 100%;">
      <div class="drop_area mg-b-20 disFlex align-center hor-center"  id="drop_area"
           :style="{'border-color': (borderhover ? '#3d8cff':'#BBBBBB')}">
        <div  style="">將文件拖拽到此處,或</div>
        <div>
          <div class="font-blue pos-r cur-hand mg-l-10" style="top: 12px;"><i class="el-icon-upload mg-r-5"></i>點(diǎn)擊上傳</div>
          <input type="file" accept="image/png,image/jpeg,image/gif" multiple class="input-upload  cur-hand"  @change ="getUpload($event)" /></div>
      </div>
      <div class="fileHtml">
        <ul class="filelist">
          <li v-for = "(item,index) in fileData"  class="mg-b-20">
              <div class="file-card">
              <!--  <p>  <img v-bind:src="item.Url" alt="" style="width: 300px;height: 300px;"></p>-->
                <div class="disFlex align-center">
                  <div><i class="el-icon-document mg-r-10"></i>{{item.fileText}}</div>
                  <div class="mg-l-30 flex text-right mg-r-20"><span class="font-blue cur-hand">查看</span><span class="mg-l-15 font-blue cur-hand" @click="deleteFile(item,index)">刪除</span></div>
                </div>
             </div>
           <!-- <p><el-progress :percentage=item.progressStatl  status="success"></el-progress></p>-->
          </li>
        </ul>
      </div>
    </div>
  </div>
</template>

二肥隆,監(jiān)聽拖動(dòng)事件事件
讓vue支持文件拖拽觉既,寫在vue的mounted:function(){},里面
將文件拖動(dòng)到區(qū)域(這里的區(qū)域就是你的div),監(jiān)聽區(qū)域拖動(dòng)事件

 mounted: function () {
        let _this = this;
      var dropbox = document.getElementById('drop_area');
      dropbox.addEventListener("drop",this.enentDrop,false)
      dropbox.addEventListener("dragleave",function (e) {
        e.stopPropagation();
        e.preventDefault();
        _this.borderhover =  false;
      })
      dropbox.addEventListener("dragenter",function (e) {
        e.stopPropagation();
        e.preventDefault();
        _this.borderhover =  true;
      })
      dropbox.addEventListener("dragover",function (e) {
        e.stopPropagation();
        e.preventDefault();
        _this.borderhover =  true
      })
    },

說(shuō)明:
1.文件第一次進(jìn)入拖動(dòng)區(qū)時(shí)絮记,觸發(fā) dragenter 事件

  1. 文件在拖動(dòng)區(qū)來(lái)回拖拽時(shí),不斷觸發(fā) dragover 事件
  2. 文件已經(jīng)在拖動(dòng)區(qū)虐先,并松開鼠標(biāo)時(shí)怨愤,觸發(fā) drop 事件
    4.文件在拖動(dòng)區(qū)來(lái)回拖拽時(shí),不斷觸發(fā)dragleave 事件 //拖后放

實(shí)現(xiàn)拖動(dòng)上傳蛹批,我們只需要關(guān)心 drop 事件撰洗。不過(guò)另外三個(gè)事件也需要監(jiān)聽篮愉,目的是阻止瀏覽器默認(rèn)行為。如果不阻止差导,那么把文件拖到瀏覽器時(shí)试躏,瀏覽器就會(huì)自動(dòng)下載這個(gè)文件(默認(rèn)行為,親們也可以親測(cè)一下)设褐,drop 事件觸發(fā)不出來(lái)颠蕴。

this.enentDrop函數(shù)寫在你的項(xiàng)目methods:{}里,監(jiān)聽事件會(huì)有文件回調(diào)e.dataTransfer
enentDrop() 函數(shù)現(xiàn)在只這些信息打印了出來(lái)助析,可以了解到犀被,拖動(dòng)到瀏覽器的每個(gè)文件都是一個(gè) File 對(duì)象:

methods:{
      enentDrop: function(e){
        this.borderhover = false
        e.stopPropagation();
        e.preventDefault();  //必填字段
        let fileData = e.dataTransfer.files;
        console.log(fileData);
        this.uploadFile(fileData)
      },
      uploadFile: function (file){   //渲染上傳文件
        for (let i = 0; i !== file.length; i++) {
          let fileJson = {
            Url:'',
            progressStatl:0,
            fileText:'',
          };
          let video_type=file[i].type == "video/mp4" || file[i].type == "video/ogg";
          if(file[i].type.indexOf('image') === 0){  //如果是圖片
            let fileurl = window.URL.createObjectURL(file[i]); //創(chuàng)建一個(gè)url連接,供src屬性引用
                fileJson.Url = fileurl;
          }else if(video_type){
              alert("不支持此類型文件")
          }else{

          }
          fileJson.fileText = file[i].name;
          this.fileData.push(fileJson);
        }
      },
      deleteFile:function (index){   //刪除已選文件
        this.$popup.open('提示','確定要?jiǎng)h除嗎',callback=>{
          this.fileData.splice(index,1);
        })
      }
    },
image.png

三,處理拖動(dòng)上傳文件

現(xiàn)在外冀,我們要給 uploadFile()函數(shù)增加功能寡键,實(shí)現(xiàn)拖動(dòng)文件時(shí),拖動(dòng)區(qū)出現(xiàn)文件名和一個(gè)上傳文件名稱和進(jìn)度條锥惋。
首先在 Vue 的 data 對(duì)象中定義fileData 屬性昌腰,用來(lái)保存所有拖動(dòng)到瀏覽器中文件的名稱。然后在uploadFile()函數(shù)每當(dāng)被調(diào)用時(shí)膀跌,把文件名和上傳進(jìn)度保存到fileJson.progressStatl 中:

 uploadFile: function (file){   //渲染上傳文件
        for (let i = 0; i !== file.length; i++) {
          let fileJson = {
            Url:'',
            progressStatl:0,
            fileText:'',
          };
          let video_type=file[i].type == "video/mp4" || file[i].type == "video/ogg";
          if(file[i].type.indexOf('image') === 0){  //如果是圖片
            let fileurl = window.URL.createObjectURL(file[i]); //創(chuàng)建一個(gè)url連接,供src屬性引用
                fileJson.Url = fileurl;
          }else if(video_type){
             let fileurl = window.URL.createObjectURL(file[i]); //創(chuàng)建一個(gè)url連接,供src屬性引用
          }else{
               alert("不支持此類型文件")
          }
          fileJson.fileText = file[i].name;
          this.fileData.push(fileJson);
        }
      },

提示:這里攔截了一些文件類型,做了一些處理固灵,如果是上傳圖片和視頻需要預(yù)覽的可以使用
let fileurl = window.URL.createObjectURL(file[i]);
window.URL.createObjectURL了解作用是捅伤,請(qǐng)點(diǎn)擊 https://developer.mozilla.org/zh-CN/docs/Web/API/URL/createObjectURL

當(dāng)被調(diào)用時(shí),把文件名巫玻,和預(yù)覽生成的路徑保存到j(luò)son里面丛忆,然后統(tǒng)一添加到fileData[ ]數(shù)組里面,實(shí)現(xiàn)上傳預(yù)覽仍秤。

 data () {
      return {
        borderhover:false,  //文件拖拖動(dòng)到區(qū)域的hover效果
        imgArr:[],
        fileData:[],
      }
    },
image.png

四熄诡,上傳到后臺(tái) 后續(xù)更新由于后臺(tái)還沒寫完接口,敬請(qǐng)期待...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诗力,一起剝皮案震驚了整個(gè)濱河市凰浮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苇本,老刑警劉巖袜茧,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瓣窄,居然都是意外死亡笛厦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門俺夕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)裳凸,“玉大人贱鄙,你說(shuō)我怎么就攤上這事∫坦龋” “怎么了逗宁?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)菠秒。 經(jīng)常有香客問(wèn)我疙剑,道長(zhǎng),這世上最難降的妖魔是什么践叠? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任言缤,我火速辦了婚禮,結(jié)果婚禮上禁灼,老公的妹妹穿的比我還像新娘管挟。我一直安慰自己,他們只是感情好弄捕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布僻孝。 她就那樣靜靜地躺著,像睡著了一般守谓。 火紅的嫁衣襯著肌膚如雪穿铆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天斋荞,我揣著相機(jī)與錄音荞雏,去河邊找鬼。 笑死平酿,一個(gè)胖子當(dāng)著我的面吹牛凤优,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜈彼,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼筑辨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了幸逆?” 一聲冷哼從身側(cè)響起棍辕,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秉颗,沒想到半個(gè)月后痢毒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚕甥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年哪替,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菇怀。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凭舶,死狀恐怖晌块,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帅霜,我是刑警寧澤匆背,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站身冀,受9級(jí)特大地震影響钝尸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搂根,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一珍促、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剩愧,春花似錦猪叙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至锦积,卻和暖如春芒帕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丰介。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工副签, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人基矮。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冠场,于是被迫代替她去往敵國(guó)和親家浇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350