1. 程式人生 > >js讀取本地檔案

js讀取本地檔案

如何在瀏覽器端預覽本地檔案

今天的主題是使用瀏覽器預覽本地檔案。

由於瀏覽器安全策略的限制,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立即失效。