衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

前端文件上傳的幾種交互造輪子

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 2023-07-04 10:39 ? 次閱讀

來源| OSCHINA 社區(qū)

作者 | 京東云開發(fā)者-京東物流 劉海鼎

背景

前端文件上傳本來是一個常規(guī)交互操作,沒什么特殊性可言,但是最近在做文件上傳,需要實現(xiàn)截圖粘貼上傳,去找了下有沒有什么好用的組件,網(wǎng)上提供的方法有,但是沒找完整的組件來支持 cv 上傳,經(jīng)過了解發(fā)現(xiàn)可以用剪貼板功能讓自己的 cv 實現(xiàn)文件上傳,于是自己就整合了目前幾種文件上傳的交互方式,碼了一個支持 cv 的 vue3 文件上傳組件(造個輪子)。

介紹

作為一個完整的組件內(nèi)容還是挺多的,這里主要介紹下上傳交互中一些主要功能,包括上傳的幾種交互方式, 上傳進度的獲取,上傳類型的限制,默認上傳請求和自定義上傳請求。 以下代碼都是非完整代碼,大家用于參考實現(xiàn)過程,可以通過以下代碼修改來完成自己想要的交互功能。

幾種交互

1,點擊選擇上傳

點擊選擇是最常見的上傳交互,之前原生上傳控件,樣式修改比較麻煩,為了修改上傳樣式,我們可以把該控件設置隱藏,用其他元素通過從 click 交互,來觸發(fā)該文件選擇控件。在選擇文件控件上綁定 onchange 事件,該控件在 change 后獲取到文件,然后調(diào)用上傳方法,實現(xiàn)如下:

2,拖動上傳

拖拽文件上傳,首先在頁面上建立一個拖放區(qū)域,在拖放區(qū)域上綁定拖放事件,監(jiān)聽拖放事件 drop 內(nèi)容中 datTransfer 中是包含 files, 如果存在 files,獲取 files 然后調(diào)用上傳附件方法。 拖放區(qū)域可以通過事件 dragover 來檢查拖放文件是否進入拖放區(qū)域來設置拖放區(qū)域懸浮樣式,通過 dragleave 來檢查離開拖放區(qū)取消懸浮樣式。 進行交互提示 實現(xiàn)如下:
+
3,復制上傳(復制檢測區(qū)域設置)

復制上傳的交互步驟

?將文件保存到剪貼板:執(zhí)行鍵盤快捷鍵或者使用鼠標復制

?將鼠標移動到可粘貼區(qū): 判斷是否移動到可粘貼區(qū),來確定是否在執(zhí)行粘貼后上傳,否則整個頁面都會作為粘貼區(qū)

?執(zhí)行粘貼操作:執(zhí)行鍵盤粘貼快捷鍵(ctrl+v) 粘貼區(qū)綁定 paste 事件,在觸發(fā) paste 事件前將鼠標移到粘貼區(qū),復制會被檢查不在粘貼區(qū),阻止上傳操作,實現(xiàn)如下:

上傳模式

根據(jù)以上三種交互,大家可自由組合上傳形式,比如點擊和拖拽,拖拽和粘貼組合等等,我這邊目前按點擊,拖拽,粘貼疊加組合,設置為:

?點擊上傳,click

?拖拽上傳 drag(包括點擊上傳和拖拽上傳)

?粘貼上傳 paste (包括點擊,拖拽和復制上傳)

通過傳參 uploadeMode 設置 (click, drag, paste)

組件設置:

組件應用


    
點擊上傳

文件限制

文件限制包括是否多文件上傳限制 multiple, 上傳數(shù)量 limit 限制,上傳類型 accept 限制,這些設置參考了 element-plus 上傳組件,在其基礎上做了簡化。實現(xiàn)如下 multiple 和 accept 首先需要在點擊控件上綁定,以便于在點擊選擇上傳時就能夠過濾對應文件,拖拽上傳和粘貼上傳,無法通過 input [type=file] 組件控制需要在上傳方法中判斷過濾,(以粘貼上傳為例) 組件實現(xiàn)

上傳進度設置

獲取文件上傳進度,使用 ajax 中的 progress 事件監(jiān)聽機制,回傳數(shù)據(jù) loaded 進度,和 ttotal 進行計算,獲取到計算的百分比通過 process 插槽線上在界面上。 具體實現(xiàn)如下: 組件實現(xiàn) 文件限制后執(zhí)行組件上傳,默認情況下走內(nèi)置的上傳方法,如果做了自定義,上傳進度也需要自己實現(xiàn)(自己實現(xiàn)過程可以參考內(nèi)置方法中的實現(xiàn))

// 上傳方法調(diào)用
ajaxUpload({...props, file})
// 上傳方法實現(xiàn)
ajaxUpload = (options) => {
const xhr = new XMLHttpRequest()
    const action = option.action
    console.log(xhr, xhr.upload)
    if (xhr.upload) {
    // 建立progress監(jiān)聽
      xhr.upload.addEventListener('progress', (evt:any) => {
        const progressEvt = evt
        progressEvt.percent = evt.total > 0 ? (evt.loaded / evt.total) * 100 : 0
        // 回傳進度數(shù)據(jù)
        option.onProgress(progressEvt)
      })
    }
}

同樣文件上傳成功,異常等方法也可以通過監(jiān)聽 load 并且判斷 xhr.status 來實現(xiàn),

xhr.addEventListener('load', () => {
      if (xhr.status < 200 || xhr.status >= 300) {
        return option.onError(getError(action, option, xhr))
      }
      option.onSuccess(getBody(xhr))
})
組件使用 ?配置獲取進度數(shù)據(jù)回調(diào)函數(shù) onProgress ?配置接收回傳的進度數(shù)據(jù)進行賦值 ?配置進度條插槽顯示進度數(shù)據(jù)

   
點擊上傳
自定義上傳請求

默認情況下,不需要自定義上傳請求,組件內(nèi)置了上傳請求,如果個人有需求可以自定義上傳請求,子定義上傳請求,是在文件限制流程后,檢查是否有自定義請求方法,如果存在就將文件傳入自定義請求方法。 組件實現(xiàn):
// 上傳文件
const uploadFiles = (files) => {
    if (files.length === 0) return
    const { limit, multiple, accept, httpRequest } = props
    // 是否多文件限制,主要用于拖拽和粘貼上傳中
    if (!multiple) {
       files = Array.from(files).slice(0, 1)
    }
    // 文件數(shù)量
    if (limit && files.length > limit) {
       /*具體大家需要的邏輯可自行定義*/
       return
    }
    // 文件類型限制
    if (accept) {
       files = filesFiltered(Array.from(files), accept)
    }
    //在文件符合條件后執(zhí)行上傳方法
    // 自定義上傳方法調(diào)用
    if(httpRequest) {
       return httpRequest(files)
    }
 }
組件應用: 注意點: 通過自定義上傳方法實現(xiàn)時,在原來組件上的屬性 action 無效

    
點擊上傳

總結

通過以上可以實現(xiàn)一個支持多種交互方式的文件上傳組件,同時也將 element-plus 中文件上傳的流程做了一個學習,因為該組件的實現(xiàn)過程就是參考了 element-plus 的實現(xiàn),在 element-plus 上傳的基礎上添加了粘貼上傳交互,該組件的實現(xiàn)重在交互方式,各個樣式風格通過插槽自定義。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 文件
    +關注

    關注

    1

    文章

    570

    瀏覽量

    24821
  • 組件
    +關注

    關注

    1

    文章

    517

    瀏覽量

    17922

原文標題:前端文件上傳的幾種交互造輪子

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙原生應用元服務開發(fā)-Web上傳文件

    Web組件支持前端頁面選擇文件上傳功能,應用開發(fā)者可以使用onShowFileSelector()接口來處理前端頁面文件
    發(fā)表于 05-08 11:17

    上傳文件

    上傳文件必須小于20M嗎?怎樣能上傳大于20M的文件
    發(fā)表于 08-10 20:11

    【MYD-Y6ULX申請】語音交互前端信號處理板

    項目名稱:語音交互前端信號處理板試用計劃:申請理由本人在語音交互領域有十年多的學習和開發(fā)經(jīng)驗,是國內(nèi)早期的wifi音箱/無線多通道語音/語音交互整機方案設計的主導者,對無線音頻/多通道
    發(fā)表于 01-22 10:34

    如何利用掃地機輪子制作ROS移動機器人地盤

    制作ROS移動機器人地盤摘要概述硬件需求車體設計電路設計程序設計摘要本教程講述如何利用掃地機輪子制作ROS移動機器人地盤。概述原本不打算自己輪子的,但是網(wǎng)上的移動機器人地盤要么巨貴--對于學生黨
    發(fā)表于 01-14 08:36

    基于PHP大文件上傳的研究和設計

    基于PHP大文件上傳的研究和設計,感興趣的可以看看。
    發(fā)表于 02-22 18:15 ?6次下載

    基于Iframe內(nèi)聯(lián)框架的異步文件上傳與刪除

    在Weh應用程序開發(fā)過程中,文件上傳功能是個很常用又非常重要的功能,它要處理的內(nèi)容主要包括:如何將上傳文件文件的形式保存到服務器,
    發(fā)表于 11-11 10:20 ?5次下載
    基于Iframe內(nèi)聯(lián)框架的異步<b class='flag-5'>文件</b><b class='flag-5'>上傳</b>與刪除

    springMVC后臺接受前端上傳文件及下載文件

    通過MultipartHttpServletRequest對象來接受前端上傳文件
    發(fā)表于 11-28 13:33 ?3396次閱讀

    如何在java上傳和下載文件

    文件上傳在web應用中非常普遍,要在jsp環(huán)境中實現(xiàn)文件上傳功能是非常容易的,因為網(wǎng)上有許多用java開發(fā)的文件
    發(fā)表于 11-13 08:00 ?11次下載

    java Web如何實現(xiàn)文件上傳與下載

    文件上傳概述,實現(xiàn)web開發(fā)中的文件上傳功能,需完成如下二步操作: 在web頁面中添加上傳輸入項在servlet 中讀取
    發(fā)表于 03-06 11:03 ?7次下載
    java Web如何實現(xiàn)<b class='flag-5'>文件</b>的<b class='flag-5'>上傳</b>與下載

    PHP教程之文件系統(tǒng)和服務器的交互資料說明

    本文檔的主要內(nèi)容詳細介紹的是PHP教程之文件系統(tǒng)和服務器的交互資料說明包括了:1.文件上傳,2.使用目錄函數(shù) ,3.與文件系統(tǒng)的
    發(fā)表于 04-18 17:04 ?4次下載
    PHP教程之<b class='flag-5'>文件</b>系統(tǒng)和服務器的<b class='flag-5'>交互</b>資料說明

    HarmonyOS應用開發(fā)okhttp3.0快速集合文件上傳

    ? ? ? ? ?應用開發(fā)過程中經(jīng)常需要進行文件上傳功能開發(fā),通過okhttp3.0可以快速集合完成文件上傳的功能。 代碼如下: OkHttpClient http = new
    的頭像 發(fā)表于 03-08 10:24 ?1774次閱讀

    使用OkHttp上傳和下載文件時顯示進度庫使用

    核心進展 該庫有助于在使用 OkHttp 上傳和下載文件時顯示進度。 CoreProgress 包括: 使用 OkHttp 下載文件時的進度。 使用 OkHttp 上傳
    發(fā)表于 03-24 11:17 ?5次下載

    SpringBoot超大文件上傳,實現(xiàn)秒傳

    當標志位true為上傳已經(jīng)完成,此時如果有相同文件上傳,則進入秒傳邏輯。如果標志位為false,則說明還沒上傳完成,此時需要在調(diào)用set的方法,保存塊號
    的頭像 發(fā)表于 11-17 10:30 ?1142次閱讀

    MarkDown文件插入圖片并上傳GitHub

    MarkDown文件插入圖片并上傳GitHub
    的頭像 發(fā)表于 01-12 17:02 ?1084次閱讀

    人機交互技術有哪幾種 人機交互技術的發(fā)展趨勢

    人機交互技術是指人與計算機之間通過各種交互方式進行信息傳遞、操作和控制的技術。隨著科技的進步,人機交互技術也在不斷發(fā)展創(chuàng)新。以下將介紹人機交互技術的
    的頭像 發(fā)表于 01-22 17:47 ?4010次閱讀
    百家乐赌博技巧网| 澳门百家乐看路博客| 赌博百家乐规则| 澳门百家乐娱乐网| 澳门1百家乐网| 逍遥坊百家乐的玩法技巧和规则 | 芦山县| 百家乐官网视频游戏双扣| 百家乐官网强弱走势图| 最新百家乐游戏机| 百家乐电子| 皇冠网注册送彩金| 澳门百家乐官网下路写法| 百家乐官网庄闲桌| 乐天堂百家乐赌场娱乐网规则| 大发888什么赢钱快| 百家乐官网3宜3忌| 百家乐官网官网站| 使用的百家乐软件| 大发888总结经验| 免费百家乐官网游戏机| 百家乐官网五铺的缆是什么意思| 百家乐在线洗码| 外围博彩| 澳门百家乐官网怎玩| 百家乐烫金筹码| 老虎机控制器| 菲律宾百家乐官网试玩| 百家乐的打法技巧| 永利高娱乐场| bet365指数| 百家乐官网屏风| 澳门玩百家乐的玩法技巧和规则 | 大发888易发| 百家乐官网平台哪个有在线支付呢| 百家乐视频游戏注册| 六合彩开奖结果直播| 连环百家乐官网怎么玩| 百家乐庄闲点| 澳门百家乐官网博彩网| 网上百家乐官方网站|