摘要:由于本例實(shí)現(xiàn)的將一個(gè)目錄樹(shù)下所有文件都平行下載到本地的同一個(gè)文件夾下。
HTML5+原生JS實(shí)現(xiàn)服務(wù)器端目錄樹(shù)中多文件下載
作者:云荒杯傾
作者博客
需求是這樣的,服務(wù)器上有一個(gè)目錄,目錄下面可能既有文件又有其他目錄,其他目錄下面也一樣,既可能有文件也有目錄;瀏覽器要顯示有這個(gè)目錄,并提供這個(gè)目錄下所有文件的一鍵下載功能。
實(shí)現(xiàn)原理實(shí)現(xiàn)這個(gè)需求,本程序考慮到的知識(shí)點(diǎn)有html5 標(biāo)簽的下載功能、數(shù)據(jù)結(jié)構(gòu)中樹(shù)的廣度優(yōu)先遍歷算法、一點(diǎn)http知識(shí)和一點(diǎn)JS局限性的知識(shí)。
HTML5 標(biāo)簽的下載功能首先說(shuō)HTML5 標(biāo)簽的下載功能,
HTML5的標(biāo)簽有一個(gè)download屬性,如果你設(shè)置了這個(gè)屬性,那么點(diǎn)擊這個(gè)鏈接,就不再是跳轉(zhuǎn)到這個(gè)標(biāo)簽href引用的地址了,而是直接去下載href所代表的一個(gè)文件。
即
這是超鏈接
這樣,點(diǎn)擊這是超鏈接幾個(gè)字,只能頁(yè)面跳轉(zhuǎn)到bbb.html。
而,
這是超鏈接
這樣,加了download屬性后,你再點(diǎn)擊這是超鏈接幾個(gè)字,就直接下載bbb.html到你的本地機(jī)器(客戶端)了,且文件會(huì)改名為“ccc.html”。如果只寫download,則是保持原始文件名下載。
一點(diǎn)http知識(shí)http是不提供目錄遍歷的,所以暫時(shí)不知道其他實(shí)現(xiàn)方法是否碰到了這個(gè)點(diǎn),所以導(dǎo)致程序失敗。某種程度上,本文的程序算是避開(kāi)了這個(gè)點(diǎn)?
一點(diǎn)JS局限性的知識(shí)JS語(yǔ)言跑在瀏覽器的話,是不能操作本地(客戶端)太多東西的,其中就包括一些文件操作,而文件夾創(chuàng)建操作就包括在這些限制操作之內(nèi)。這也是無(wú)法實(shí)現(xiàn)將服務(wù)器上的一個(gè)目錄按照其目錄結(jié)構(gòu)原樣拷貝到本地(客戶端)的原因。
看過(guò)一篇博文的舉例很好,他說(shuō),如果我有一個(gè)網(wǎng)站,你是訪客,你訪問(wèn),點(diǎn)擊了某個(gè)鏈接,我就把網(wǎng)站的一個(gè)目錄樹(shù)(假設(shè)有一百萬(wàn)個(gè)txt),拷貝到你的本地,你會(huì)不會(huì)惱火?而且,之所以瀏覽器不提供這些功能,主要是出于客戶端安全方面的考慮。
做這個(gè)需求的時(shí)候,看到IE上有一個(gè)activexObject對(duì)象,可以在本地創(chuàng)建文件夾。但是想想就只有IE支持,還是算了。
綜上,本程序是將服務(wù)器上一個(gè)有層次的目錄樹(shù)里面所有的文件,通過(guò)瀏覽器下載到本地同一個(gè)文件夾下的。
不過(guò)因?yàn)?strong>下載一個(gè)目錄樹(shù)的功能,最主要的考察點(diǎn)還是樹(shù)狀數(shù)據(jù)結(jié)構(gòu)的遍歷,如果哪天瀏覽器都實(shí)現(xiàn)了本地創(chuàng)建文件夾,本程序的代碼仍有參考價(jià)值。
目錄樹(shù)的廣度優(yōu)先遍歷及本程序的實(shí)現(xiàn)思路本例的思路是,前后端定義一個(gè)目錄樹(shù)的接口。
前端通過(guò)xhr拿到數(shù)據(jù)。
一層一層遍歷這顆目錄樹(shù),直到遍歷完這個(gè)目錄樹(shù)下所有文件,也就能拿到這所有文件的URL了。假設(shè)一共有n個(gè)文件,也就是n個(gè)URL。
拿到n個(gè)URL后,注冊(cè)這個(gè)目錄對(duì)應(yīng)的下載該目錄下所有文件按鈕的監(jiān)聽(tīng)器,監(jiān)聽(tīng)器內(nèi)創(chuàng)建n個(gè)html5 標(biāo)簽,標(biāo)簽的href分別賦值url路徑,所有標(biāo)簽設(shè)置download屬性。
如此,就實(shí)現(xiàn)了加載HTML,HTML上有一個(gè)代表著服務(wù)器上一個(gè)目錄的目錄名,目錄名后面有一個(gè)下載該目錄下所有文件的按鈕,點(diǎn)擊該按鈕,就從服務(wù)器下載了該目錄下所有文件到本地。
本文定義的目錄樹(shù)結(jié)構(gòu)目錄樹(shù)接口定義如下,一個(gè)目錄要有name(也就是URL),file是該層目錄下裸露的文件,childDir是該層有的下一層的目錄,如此往復(fù)。。。如果到了某一目錄,既沒(méi)有文件有沒(méi)有目錄,那么name就定義為[]數(shù)組,childDir也定義為[]數(shù)組。
本例中的目錄樹(shù)是:根目錄./chrome61module,其下有三個(gè)文件,分別是aa.css,aa.js,module-test.html,還有一個(gè)目錄bb;bb目錄下只有兩個(gè)文件bb.js和bb.html。
//假設(shè)這是從服務(wù)器取來(lái)的a鏈接的目錄結(jié)構(gòu) var rootDir = { "name":"./chrome61module", "file":["/aa.css","/aa.js","/module-test.html"], "childDir":[{ "name":"./chrome61module/bb", "file":["/bb.js","/bb.html"], "childDir":[] },{}] };效果展示
圖1 HTML頁(yè)面
圖2 點(diǎn)擊下載該目錄下所有文件Chrome會(huì)提示你是否要下載多個(gè)文件
圖3 本例中下載成功的五個(gè)文件
代碼比較簡(jiǎn)單,就直接放了,大家直接自己粘貼了,就能運(yùn)行,注意修改目錄樹(shù)結(jié)構(gòu)為你自己的。
chrome61module目錄總結(jié)
1、由于http和JS能力的限制,目前僅能實(shí)現(xiàn)文件下載,不能實(shí)現(xiàn)文件夾下載或者文件夾本地創(chuàng)建,因此想原樣拷貝服務(wù)器上一個(gè)目錄到本地機(jī)器,使用JS目前較難做到。
2、由于本例實(shí)現(xiàn)的將一個(gè)目錄樹(shù)下所有文件都平行下載到本地的同一個(gè)文件夾下。造成客戶端即使下載了也無(wú)法理解服務(wù)器上原目錄樹(shù)的困難。
一點(diǎn)改進(jìn)是,如果使用download=“”,將“”內(nèi)的文件名改為包含路徑的文件名,也許下載以后,客戶端可以獲悉其原來(lái)在服務(wù)器上的對(duì)應(yīng)的目錄層級(jí),從而可以自己后續(xù)處理。
3、如果可能,還是按照壓縮包的形式下載一個(gè)目錄也許更好。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/51311.html
摘要:由于本例實(shí)現(xiàn)的將一個(gè)目錄樹(shù)下所有文件都平行下載到本地的同一個(gè)文件夾下。 HTML5+原生JS實(shí)現(xiàn)服務(wù)器端目錄樹(shù)中多文件下載 作者:云荒杯傾作者博客 需求 需求是這樣的,服務(wù)器上有一個(gè)目錄,目錄下面可能既有文件又有其他目錄,其他目錄下面也一樣,既可能有文件也有目錄;瀏覽器要顯示有這個(gè)目錄,并提供這個(gè)目錄下所有文件的一鍵下載功能。 實(shí)現(xiàn)原理 實(shí)現(xiàn)這個(gè)需求,本程序考慮到的知識(shí)點(diǎn)有html5 ...
摘要:同源策略是什么跨域通信同源兩個(gè)文檔同源需滿足協(xié)議相同域名相同端口相同跨域通信進(jìn)行操作通信時(shí)如果目標(biāo)與當(dāng)前窗口不滿足同源條件,瀏覽器為了安全會(huì)阻止跨域操作。 同源策略是什么? javascript跨域通信 同源:兩個(gè)文檔同源需滿足 協(xié)議相同 域名相同 端口相同 跨域通信:js進(jìn)行DOM操作、通信時(shí)如果目標(biāo)與當(dāng)前窗口不滿足同源條件,瀏覽器為了安全會(huì)阻止跨域操作??缬蛲ㄐ磐ǔS幸韵路椒?...
摘要:一為什么選擇是當(dāng)前前端應(yīng)用最廣泛的框架。目前來(lái)看的生態(tài)系統(tǒng)要比大的多,在等最大的技術(shù)社區(qū)搜索兩者,的搜索結(jié)果是的十倍左右,另外據(jù)近期統(tǒng)計(jì)使用的站點(diǎn)是的幾百倍以上。其中是基于技術(shù),依然是瀏覽器應(yīng)用。 一、為什么選擇React React是當(dāng)前前端應(yīng)用最廣泛的框架。三大SPA框架 Angular、React、Vue比較。 Angular出現(xiàn)最早,但其在原理上并沒(méi)有React創(chuàng)新的性能優(yōu)化...
摘要:但如果要使用模式,我們需要在后端進(jìn)行額外配置。模式的配置方法我們來(lái)看看官方文檔是教我們?cè)趺磁渲玫哪J?。模式的配置?shí)踐及原理強(qiáng)烈建議閱讀這部分之前,先看一下的這部分文檔和這部分文檔。只配置前端的情況首先,我們將設(shè)置為,但不配置后端。 始發(fā)于我的博客 ryougifujino.com,歡迎訪問(wèn)留言。 vue-router分為hash和history模式,前者為其默認(rèn)模式,url的表現(xiàn)形式為...
閱讀 2385·2021-11-24 10:31
閱讀 3438·2021-11-23 09:51
閱讀 2252·2021-11-15 18:11
閱讀 2398·2021-09-02 15:15
閱讀 2463·2019-08-29 17:02
閱讀 2296·2019-08-29 15:04
閱讀 843·2019-08-29 12:27
閱讀 2866·2019-08-28 18:15