溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HTML5如何實(shí)現(xiàn)拖拽批量上傳文件的案例

發(fā)布時(shí)間:2020-10-26 09:49:10 來源:億速云 閱讀:220 作者:小新 欄目:web開發(fā)

HTML5如何實(shí)現(xiàn)拖拽批量上傳文件的案例?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

一、組件描述

  1. 同時(shí)拖拽多個(gè)文件夾

  2. 刪除指定文件夾

  3. 顯示當(dāng)前文件夾的上傳進(jìn)度條

  4. 超過5M的文件夾分片上傳

效果如下:

HTML5如何實(shí)現(xiàn)拖拽批量上傳文件的案例

二、遇到的問題

  1. 拖拽讀取每個(gè)文件夾下面的文件路徑

  2. 如何顯示當(dāng)前上傳的文件夾的進(jìn)度條

  3. 上傳文件時(shí)跨域攜帶 cookie

  4. 文件夾分片

三、解決過程

1. 拖拽讀取每個(gè)文件夾下面的文件路徑

在進(jìn)行拖放操作時(shí), DataTransfer 對象用來保存,通過拖放動(dòng)作,拖動(dòng)到瀏覽器的數(shù)據(jù)。它可以保存一項(xiàng)或多項(xiàng)數(shù)據(jù)、一種或者多種數(shù)據(jù)類型

// 拖拽文件夾
dropFolders (e) {
  e.stopPropagation()
  e.preventDefault()
  var items = e.dataTransfer.items
  for (var i = 0; i < items.length; i++) {
    var item = items[i].webkitGetAsEntry()
    if (item) {
      this.checkFolders(item)
    }
  }
}

// 判斷是否為文件夾
checkFolders (item) {
  if (item.isDirectory) {
    this.traverseFileTree(item)
  } else {
    this.$alert('只支持上傳文件夾', '提示', {
      confirmButtonText: '確定'
    })
  }
}

traverseFileTree (item, path, parentDir) {
  path = path || ''
  if (item.isFile) {
    item.file((file) => {
        let obj = {
          file: file,
          path: path + file.name,
          attr: item.attr
        }
        this.filesList.push(obj)
    })
  } else if (item.isDirectory) {
    var dirReader = item.createReader()
    dirReader.readEntries((entries) => {
      for (let i = 0; i < entries.length; i++) {
        entries[i].attr = item.attr
        this.traverseFileTree(entries[i], path + item.name + '/', temp)
      }
    }, function (e) {
      console.log(e)
    })
  }
}

2. 上傳文件夾的進(jìn)度條

沒有分片的文件:根據(jù)文件夾中的文件總數(shù),算出每個(gè)文件占文件夾的百分比,當(dāng)一個(gè)文件上傳成功時(shí),修改文件夾 process;

分片的文件:算出每個(gè)文件占文件的百分比后,算出每塊文件占文件的百分比,每塊文件上傳成功后,修改文件夾的 process.

3. 跨域攜帶 cookie

當(dāng)服務(wù)器設(shè)置響應(yīng)頭

Access-Control-Allow-Origin:必須指定明確的、與請求網(wǎng)頁一致的域名,不能為 *。   Access-Control-Allow-Credentials: true

設(shè)置請求頭:

withCredentials:true

補(bǔ)充:

substring 和 substr 的區(qū)別

substr(start [, length ]) 返回一個(gè)從指定位置開始的指定長度的子字符串。

start:必選項(xiàng)。所需的子字符串的起始位置。字符串中的第一個(gè)字符的索引為 0。
length:可選項(xiàng)。在返回的子字符串中應(yīng)包括的字符個(gè)數(shù)。

substring 返回位于 String 對象中指定位置的子字符串,返回一個(gè)包含從 start 到最后(不包含 end )的子字符串的字符串

start:指明子字符串的起始位置,該索引從 0 開始起算。
end:指明子字符串的結(jié)束位置,該索引從 0 開始起算。

感謝各位的閱讀!看完上述內(nèi)容,你們對HTML5如何實(shí)現(xiàn)拖拽批量上傳文件的案例大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI