AetherUpload:大文件秒傳插件,移植自Laravel擴(kuò)展包

簡介
本項(xiàng)目移植自AetherUpload-Laravel
提供超大文件上傳,支持斷線續(xù)傳、秒傳、自定義中間件、自定義路由、分組配置等功能,簡單易用,滿足多數(shù)人的主流需求。無感知化的設(shè)計(jì)理念,可實(shí)現(xiàn)由擴(kuò)展自動(dòng)接管上傳和訪問請求,開發(fā)者專注于業(yè)務(wù),無需關(guān)心上傳流程,無需編寫適配代碼,幾乎開箱即用,節(jié)省大量開發(fā)時(shí)間?,F(xiàn)已基于Laravel擴(kuò)展包移植為Webman插件。
功能特性
- 百分比進(jìn)度條
- 文件類型限制
- 文件大小限制
- 多語言支持
- 資源分組配置
- 上傳完成事件
- 同步上傳 ①
- 斷線續(xù)傳 ②
- 文件秒傳 ③
- 自定義中間件 ④
- 自定義路由
- 寬松模式
①:同步上傳相比異步上傳,在上傳帶寬足夠大的情況下速度稍慢,但同步可在上傳同時(shí)進(jìn)行文件的拼合,而異步因文件塊上傳完成的先后順序不確定,需要在所有文件塊都完成時(shí)才能拼合,將會導(dǎo)致異步上傳在接近完成時(shí)需等待較長時(shí)間。同步上傳每次只有一個(gè)文件塊在上傳,在單位時(shí)間內(nèi)占用服務(wù)器的內(nèi)存較少,相比異步方式可支持更多人同時(shí)上傳。
②:斷線續(xù)傳和斷點(diǎn)續(xù)傳不同,斷線續(xù)傳是指遇到斷網(wǎng)或無線網(wǎng)絡(luò)不穩(wěn)定時(shí),在不關(guān)閉頁面的情況下,上傳組件會定時(shí)自動(dòng)重試,一旦網(wǎng)絡(luò)恢復(fù),文件會從未上傳成功的那個(gè)文件塊開始繼續(xù)上傳。斷線續(xù)傳在刷新頁面或關(guān)閉后重開是無法續(xù)傳的,之前上傳的部分已成為無效文件。
③:文件秒傳需服務(wù)端Redis和客戶端瀏覽器支持(FileReader、File.slice()),兩者缺一則秒傳功能無法生效。默認(rèn)關(guān)閉,需在配置文件中開啟。
④:結(jié)合自定義中間件,可對已上傳資源的訪問、下載行為進(jìn)行權(quán)限控制。
安裝
0 在終端內(nèi)切換到你的webman項(xiàng)目根目錄,執(zhí)行composer require peinhu/aetherupload-webman ^1.0
1 在瀏覽器訪問http://域名/aetherupload
可到達(dá)示例頁面
提示:更改相關(guān)配置選項(xiàng)請編輯config/plugin/peinhu/aetherupload-webman/app.php
。
使用
文件上傳
參考示例文件及注釋部分,在需要上傳大文件的頁面引入相應(yīng)文件和代碼。
可使用自定義中間件來對文件上傳進(jìn)行額外過濾,還可使用上傳完成事件對上傳的文件進(jìn)一步處理。
分組配置
在配置文件的groups下新增分組,運(yùn)行php webman aetherupload:groups
自動(dòng)創(chuàng)建對應(yīng)目錄。
自定義中間件
參考Webman文檔路由中間件部分,創(chuàng)建你的中間件并將你編寫的中間件名稱填入配置文件對應(yīng)部分,如[app\middleware\MiddlewareA::class,app\middleware\MiddlewareB::class]
。
上傳完成事件
分為上傳完成前和上傳完成后事件,參考Webman文檔常用組件Event事件部分,為'aetherupload.before_upload_complete'
及'aetherupload.upload_complete'
配置對應(yīng)的事件處理類,在本插件配置文件app.php中將groups
下相應(yīng)選項(xiàng)設(shè)置為true
。
添加秒傳功能(需Redis及瀏覽器支持)
參考Webman文檔Redis部分,安裝所需依賴。安裝Redis并啟動(dòng)服務(wù)。安裝predis包composer require predis/predis
,在config/redis.php
中設(shè)置client為'predis'
。
提示:在Redis中維護(hù)了一份與實(shí)際資源文件對應(yīng)的秒傳清單,實(shí)際資源文件的增刪造成的變化均需要同步到秒傳清單中,否則會產(chǎn)生臟數(shù)據(jù),擴(kuò)展包已包含新增部分,當(dāng)刪除資源文件時(shí),使用者需手動(dòng)調(diào)用對應(yīng)方法刪除秒傳清單中的記錄。
\AetherUpload\Util::deleteResource($savedPath); //刪除對應(yīng)的資源文件
\AetherUpload\Util::deleteRedisSavedPath($savedPath); //刪除對應(yīng)的Redis秒傳記錄
使用方便的控制臺命令
php webman aetherupload:groups
列出所有分組并自動(dòng)創(chuàng)建對應(yīng)目錄
php webman aetherupload:build
在Redis中重建資源文件的秒傳清單
php webman aetherupload:clean 2
清除2天前的無效臨時(shí)文件