摘要:回調(diào)函數(shù)回調(diào)函數(shù)文件夾拖動(dòng)攔截默認(rèn)行為,并阻止冒泡文件夾拖動(dòng)或者文件拖動(dòng),瀏覽器默認(rèn)會(huì)直接打開(kāi)顯示,圖片尤為明顯,所以首先需要阻止默認(rèn)行為。
前言
文件拖動(dòng)上傳,對(duì)于個(gè)別應(yīng)用場(chǎng)景十分有效,實(shí)現(xiàn)起來(lái)也并不難。參見(jiàn)
“瀏覽器圖片預(yù)覽 --http://blog.segmentfault.com/bornkiller/1190000000428572"。
現(xiàn)在更進(jìn)一步,做到文件夾拖動(dòng)。Filsesystem不是w3c標(biāo)準(zhǔn),所以chrome瀏覽器支持度良好,其它瀏覽器大部分不支持。以下內(nèi)容全基于chrome 36 版本測(cè)試成功。
探索FileSystem API -- http://www.html5rocks.com/zh/tutorials/file/filesystem/
DirectoryEntry -- https://developer.mozilla.org/en-US/docs/Web/API/DirectoryEntry
FileSystem API啟用文件存儲(chǔ)系統(tǒng)API 被分為以下不同的主題:
讀取和處理文件:File/Blob、FileList、FileReader
創(chuàng)建和寫(xiě)入:BlobBuilder、FileWriter
目錄和文件系統(tǒng)訪問(wèn):DirectoryReader、FileEntry/DirectoryEntry
做文件處理,需要向?yàn)g覽器申請(qǐng)空間。需要注意的是,此處申請(qǐng)的空間不可與硬盤(pán)上文件直接交互,在存儲(chǔ)上,與cookie較為相似,存儲(chǔ)在硬盤(pán)上,但不能與硬盤(pán)進(jìn)行文件交換。
var requestFileSystem = window.requestFileSystem ? window.requestFileSystem: window.webkitRequestFileSystem; // success 回調(diào)函數(shù) var onInitFS = function(fs) {}; // error 回調(diào)函數(shù) var onInitFE = function(fe) {}; requestFileSystem(window.TEMPORARY, 10*1024*1024, onInitFS, onInitError);文件夾拖動(dòng) 攔截默認(rèn)行為,并阻止冒泡
文件夾拖動(dòng)或者文件拖動(dòng),瀏覽器默認(rèn)會(huì)直接打開(kāi)顯示,圖片尤為明顯,所以首先需要阻止默認(rèn)行為。
window.addEventListener("load", function(evt) { document.addEventListener("drop", prevent); document.addEventListener("dragenter", prevent); document.addEventListener("dragleave", prevent); document.addEventListener("dragover", prevent); }); function prevent(e){ e.stopPropagation(); e.preventDefault(); }獲得FileEntry/DirectoryEntry
e.dataTransfer.items在firefox下為undefined,chrome下正常。
document.addEventListener("drop",entryResolve); function entryResolve(e){ var items = e.dataTransfer.items; // 多文件/文件夾拖動(dòng)時(shí),items.length即為拖入文件/文件夾數(shù)量 var itemsCount = items.length; // 獲取文件/文件夾Entry對(duì)象 var entries = []; for (var i=0; i處理FileEntry/DirectoryEntry //每個(gè)Entry對(duì)象具備isDirectory, isFile屬性,判定目標(biāo)為文件或是文件夾。具體接口可以自行查閱
entries.forEach(function(entry, key) { if(entry.isDirectory && !entry.isFile) { // entry is DirectoryEntry here }else if(!entry.isDirectory && entry.isFile) { // entry is FileEntry here }else{ return false; } })文件夾遍歷如果確定文件路徑,可使用getFile()方法
如果確定目錄路徑,可使用getDirectory()方法
如果遞歸刪除,可使用removeRecursively()方法
如果不確定,只能采取目錄遍歷.由于目錄遍歷為異步操作,所以需要將目錄內(nèi)容處理回調(diào)函數(shù)作為傳入?yún)?shù)。
function readDir(directoryEntry, readDirCallback) { // 判定參數(shù)類型是否匹配 if (!directoryEntry.isDirectory || !typeof value === "function") { return false; } var fileEntriesContainer = []; // 創(chuàng)建目錄遍歷器 dirReader var dirReader = directoryEntry.createReader(); // 遍歷目錄,由于無(wú)法一次性返回全部,所以需要遞歸調(diào)用,直到返回結(jié)果為空,執(zhí)行回調(diào)函數(shù)。 var readEntries = function() { dirReader.readEntries (function(results) { if (!results.length) { readDirCallback(fileEntriesContainer); } else { fileEntriesContainer = fileEntriesContainer.concat(toArray(results)); readEntries(); } }, errorHandler); }; readEntries(); }如果引入了Q模塊,可以通過(guò)promise/defer方式來(lái)實(shí)現(xiàn)。
function readDirectoryEntry(directoryEntry) { return Q.Promise(function(resolve, reject) { if(directoryEntry.isDirectory) { resolve(true); } else { reject(false); } }).then(function() { return readDirectory(directoryEntry); }) }; // 返回值為promise,傳遞值為目錄下所有的entry對(duì)象組成的數(shù)組。 function readDirectory(directoryEntry) { var defer = Q.defer(); var fileEntriesContainer = []; var dirReader = directoryEntry.createReader(); // Call the reader.readEntries() until no more results are returned. var readEntries = function() { dirReader.readEntries(function(results) { if (!results.length) { defer.resolve(fileEntriesContainer); } else { fileEntriesContainer = fileEntriesContainer.concat(toArray(results)); readEntries(); } }, function(err) { defer.reject(err.message); }); }; readEntries(); return defer.promise; }FileEntry 轉(zhuǎn)換 File 及文件操作// 通過(guò)file函數(shù)即可獲得File 對(duì)象 // File 對(duì)象處理請(qǐng)自行參閱 FileReader entry.file(function(file){ var fileReader = new FileReader(); fileReader.readAsText(file); fileReader.addEventListener("load", function(){ console.log(this.result); }) })交流QQ : 491229492
注明交流即可
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87617.html
摘要:對(duì)上的文件進(jìn)行上傳和下載是對(duì)集群的基本操作,在權(quán)威指南一書(shū)中,對(duì)文件的上傳和下載都有代碼的實(shí)例,但是對(duì)如何配置客戶端卻是沒(méi)有講得很清楚,經(jīng)過(guò)長(zhǎng)時(shí)間的搜索和調(diào)試,總結(jié)了一下,如何配置使用集群的方法,以及自己測(cè)試可用的對(duì)集群上的文件進(jìn)行操作的程 對(duì)HDFS上的文件進(jìn)行上傳和下載是對(duì)集群的基本操作,在《HADOOP權(quán)威指南》一書(shū)中,對(duì)文件的上傳和下載都有代碼的實(shí)例,但是對(duì)如何配置HADOOP...
摘要:場(chǎng)景最近,小明遇到這樣一種情況在網(wǎng)頁(yè)中上傳文件時(shí)偶爾頁(yè)面會(huì)崩潰。小明仔細(xì)測(cè)試了這種情況,發(fā)現(xiàn)之前用的一個(gè)文件上傳組件有一點(diǎn)缺陷,于是,小明決定自己手寫(xiě)一個(gè),樣式如下圖一是沒(méi)有上傳文件時(shí)的樣式,圖二為上傳文件后的樣式。 場(chǎng)景 最近,小明遇到這樣一種情況:在網(wǎng)頁(yè)中上傳文件時(shí)偶爾頁(yè)面會(huì)崩潰。小明仔細(xì)測(cè)試了這種情況,發(fā)現(xiàn)之前用的一個(gè)文件上傳組件有一點(diǎn)缺陷,于是,小明決定自己手寫(xiě)一個(gè),樣式如下:...
摘要:引入當(dāng)使用上傳圖片文件時(shí),如何在上傳到服務(wù)器之前,在本地進(jìn)行預(yù)覽對(duì)象對(duì)象允許應(yīng)用程序異步讀取用戶計(jì)算機(jī)上的文件。 引入 當(dāng)使用上傳圖片文件時(shí),如何在上傳到服務(wù)器之前,在本地進(jìn)行預(yù)覽? FileReader 對(duì)象 FileReader對(duì)象允許Web應(yīng)用程序異步讀取用戶計(jì)算機(jī)上的文件。使用new創(chuàng)建一個(gè)FileReader實(shí)例對(duì)象: let fileReader = new FileRea...
摘要:引入當(dāng)使用上傳圖片文件時(shí),如何在上傳到服務(wù)器之前,在本地進(jìn)行預(yù)覽對(duì)象對(duì)象允許應(yīng)用程序異步讀取用戶計(jì)算機(jī)上的文件。 引入 當(dāng)使用上傳圖片文件時(shí),如何在上傳到服務(wù)器之前,在本地進(jìn)行預(yù)覽? FileReader 對(duì)象 FileReader對(duì)象允許Web應(yīng)用程序異步讀取用戶計(jì)算機(jī)上的文件。使用new創(chuàng)建一個(gè)FileReader實(shí)例對(duì)象: let fileReader = new FileRea...
摘要:前言因?yàn)轫?xiàng)目需求,需要把圖片上傳至阿里云,我的接口和后臺(tái)項(xiàng)目是分開(kāi)的,都使用的框架開(kāi)發(fā),接入這里就不做討論了,這里主要說(shuō)一下上傳阿里的問(wèn)題。 前言 因?yàn)轫?xiàng)目需求,需要把圖片上傳至阿里云 OSS,我的 Api 接口和后臺(tái)項(xiàng)目是分開(kāi)的,都使用的 laravel 框架開(kāi)發(fā),Api 接入 OSS 這里就不做討論了,這里主要說(shuō)一下 laravel-admin 上傳阿里 OSS 的問(wèn)題。 網(wǎng)上的一...
閱讀 3415·2023-04-26 02:41
閱讀 2469·2023-04-26 00:14
閱讀 2884·2021-08-11 10:22
閱讀 1292·2019-12-27 11:38
閱讀 3582·2019-08-29 18:34
閱讀 2390·2019-08-29 12:13
閱讀 2963·2019-08-26 18:26
閱讀 1873·2019-08-26 16:49