js讀取本地檔案
阿新 • • 發佈:2019-01-27
如何在瀏覽器端預覽本地檔案
今天的主題是使用瀏覽器預覽本地檔案。
由於瀏覽器安全策略的限制,javascript程式不能自由地訪問本地資源,這是對使用者資訊保安來說,是一項不得不遵守的準則。假如網路上的javascript程式可以自如地訪問使用者主機的本地資源,那麼瀏覽器使用者將毫無安全可言。儘管有這個安全限制,但是在得到使用者允許的情況下,瀏覽器還是可以訪問本地資源的。
獲得使用者允許的方法就是通過標籤來讓使用者手動選擇檔案,這一過程就是使用者授予訪問許可權的過程。然後 使用獲得File 物件通過URL.createObjectURL(file)轉換為檔案url, 就可以傳遞給類似y於img,video,audio等標籤使用了。我將本地檔案轉換為url 的功能封裝成了一個類。
function LocalFileUrl(){
var _this = this;
this.input_id = 'input_getLocalFile'+ Math.round(Math.random() * 1000);
$("body").append("<input type='file' style='display:none' id='"+this.input_id+"' multiple>");
this.urls=[];
var _this = this;
$("#" + this.input_id).change(function (e){
console.log("change");
//如果_this.urls 不為空,則釋放url
if(_this.urls){
_this.urls.forEach(function(url,index,array){
URL.revokeObjectURL(url.url);//一經釋放,馬上將無法使用這個url的資源
});
_this.urls = [];
}
$(this.files).each(function (index,file){
var url = URL.createObjectURL(file);
_this.urls.push({url:url,file:file});
});
typeof _this.getted == 'function' && _this.getted(_this.urls);
})
}
/*
引數說明:getted:function(urls){}
urls是一個url物件陣列。[url]
url = {
url:url, //選取的檔案url
file:file //選取的檔案物件引用
}
*/
LocalFileUrl.prototype.getUrl = function(getted){
this.getted = getted;
$("#"+ this.input_id).click();
}
使用方法:
var localFileUrl = new LocalFileUrl();//例項化物件
//觸發讀取,彈出檔案選擇框,並且監聽檔案選擇事件。
localFileUrl.getUrl(function(urls){
urls.forEach(function(item,index,array){
$("body").append("<div>"+index+"----"+item.url+"</div>")
})
})
使用jQuery 的promise物件改寫
這種方式的好處是可以使用鏈式寫法,並且可以繫結多個done事件處理函式,執行順序按照繫結順序。
function LocalFileUrl(){
this.dtd ={};
this.input_id = 'input_getLocalFile'+ Math.round(Math.random() * 1000);
$("body").append("<input type='file' style='display:none' id='"+this.input_id+"' multiple>");
this.urls=[];
var _this = this;
$("#" + this.input_id).change(function(e){
//如果_this.urls 不為空,則釋放url
if(_this.urls){
_this.urls.forEach(function(url,index,array){
URL.revokeObjectURL(url.url);//一經釋放,馬上將無法使用這個url的資源
});
_this.urls = [];
}
$(this.files).each(function(index,file){
var url = URL.createObjectURL(file);
_this.urls.push({url:url,file:file});
});
//傳入一個可選的引數陣列
_this.dtd.resolveWith(window,new Array(_this.urls));
})
}
/*
返回一個jquery 的promise 物件,可以繫結done()事件。done(urls)接收一個urls陣列
{
url:url,
file:file// 選取的檔案物件
}
*/
LocalFileUrl.prototype.getUrl = function(){
this.dtd = $.Deferred();
$("#"+ this.input_id).click();
return this.dtd.promise();
}
使用方式
var localFilrUrl = new LocalFileUrl();
// 繫結done事件
localFileUrl.getUrl().done(function(urls){
urls.forEach(function(item,index,array){
$("body").append("<div>"+index+"----"+item.url+"</div>")
})
}).done(function(){
console.log("完成");
}).done(function(){
alert("已經讀取了本地檔案路徑");
})
相容性
URL.createObjectURL(File/Blob)是一個實驗性的功能。IE10及以上版本相容。與之對應的是URL.revokeObjectURL(url),它用來告訴瀏覽器已經不需要這個url的引用了,可以釋放掉了。一經呼叫,這個url立即失效。