JavaScript文件與目錄操作技巧

2018-08-12 11:54 更新

JavaScript設(shè)置表單上傳時(shí)文件個(gè)數(shù)的方法


這是一個(gè)比較實(shí)用的功能,用JavaScript來(lái)設(shè)置表單上傳文件時(shí),根據(jù)需要生成上傳表單,要幾個(gè)生成幾個(gè),在網(wǎng)易郵箱、新浪郵箱的添加附件功能里都有這種功能,不過(guò)這一款沒有刪除表單的功能,如果輸入的多了,只好重新來(lái)過(guò)啦

運(yùn)行效果如下圖所示:


具體代碼如下:

<title>JavaScript設(shè)置表單上傳時(shí)的文件個(gè)數(shù)</title>
<input type="button" name="button" value="添加附件" onclick="addInput()">
<input type="button" name="button" value="刪除附件" onclick="deleteInput()">
<span id="upload"></span>
<script type="text/javascript">
 var attachname = "attach";
 var i=1;
  function addInput(){
  if(i>0){
   var attach = attachname + i ;
   if(createInput(attach))
    i=i+1;
  }
  } 
  function deleteInput(){
   if(i>1){
   i=i-1;
   if(!removeInput())
    i=i+1;
   }
  } 
  function createInput(nm){ 
  var aElement=document.createElement("input"); 
  aElement.name=nm;
  aElement.id=nm;
  aElement.type="file";
  aElement.size="50";
  //aElement.value="thanks"; 
  //aElement.onclick=Function("asdf()"); 
   if(document.getElementById("upload").appendChild(aElement) == null)
    return false;
   return true;
  } 
  function removeInput(nm){
   var aElement = document.getElementById("upload");
   if(aElement.removeChild(aElement.lastChild) == null)
   return false;
   return true; 
  } 
</script>




JavaScript File API文件上傳預(yù)覽


對(duì)于基于瀏覽器的應(yīng)用而言,訪問本地文件都是一件頭疼的事情,通常我們能做的僅僅是使用<input type="file">標(biāo)簽來(lái)上傳文件。實(shí)現(xiàn)過(guò)程是:選取文件的時(shí)候value 屬性保存了用戶指定的文件的名稱,表單被提交的時(shí)候,瀏覽器會(huì)向服務(wù)器發(fā)送選中的文件的內(nèi)容而不僅僅是發(fā)送文件名。再獲取服務(wù)器返回的地址,然后做預(yù)覽。
  

但是如果有一天我們要上傳一個(gè)圖片,傳了圖片后預(yù)覽想換另一張圖片,就又得先上傳到服務(wù)器再預(yù)覽。在網(wǎng)絡(luò)比較慢的情況下,這樣真的很折騰。
  

所以我們某些時(shí)候需要先預(yù)覽再上傳到服務(wù)器,特別是一些有剪切功能的需求,例如新浪微博的頭像更換。但是目前能做的只能是借助插件開發(fā)或者使用flash,由于不同瀏覽器的技術(shù)實(shí)現(xiàn)不盡相同,為了讓程序能夠支持多瀏覽器,我們的程序就會(huì)變得十分復(fù)雜而難于維護(hù)。幸好現(xiàn)在有了File API。
  

通過(guò)監(jiān)聽change事件我們可得知用戶選擇的文件,并且添加了一個(gè)files集合,集合中將包含file對(duì)象,每個(gè)file對(duì)象對(duì)應(yīng)著一個(gè)文件。并且都有以下只讀屬性name,size,type,lastModifiedDate.
以<input type="file" name="file">為例,監(jiān)控onchange事打印它的file對(duì)象:


由此我們可得知用戶選取的文件格式,文件名以及文件大小等等的一些信息。因此我們很容易就能為所選取的文件作驗(yàn)證判斷是否符合我們定的一些要求。

除此之外File API還提供了FileReader類型讀取文件中的數(shù)據(jù)。


FileReader類型實(shí)現(xiàn)的事一種異步文件讀取機(jī)制,類似于XMLHttpRequest,但是它讀的是文件系統(tǒng)而不是遠(yuǎn)程服務(wù)器。并且提供了幾種讀取方法:

  • readAsText(file,encoding):以純文本形式讀取文件,將讀取到的文本保存在result屬性中,第二個(gè)參數(shù)用于指定編碼類型,可選。
  • readAsDataURL(file):讀取文件以數(shù)據(jù)URL的形式保存在result屬性中。
  • readAsBinaryString(file):讀取文件并將一個(gè)字符串保存在result屬性中。
  • readAsArrayBuffer(file):讀取文件并將一個(gè)包含文件人容的ArrayBuffer保存在result屬性中

通過(guò)以上方法分別讀取同一張本地圖片,并且把保存在result屬性中的信息打印出來(lái)對(duì)比如下:


readAsText(file,encoding):


readAsDataURL(file):
通過(guò)以上對(duì)比我們發(fā)現(xiàn)這些讀取文件的方法為靈活的處理文件數(shù)據(jù)提供了極大的方便。例如讀取圖像文件并且保存為數(shù)據(jù)url,可以做上傳前的預(yù)覽功能。
  

由于讀取的過(guò)程是異步的,所以FileReader里面有幾個(gè)事件分別處理不同的情況:progress(是否讀取了新數(shù)據(jù))、erro(是否發(fā)生了錯(cuò)誤)、load(是否已經(jīng)讀完了整個(gè)文件)。
  

由于種種原因無(wú)法讀取文件就會(huì)觸發(fā)error事件,觸發(fā)error事件的時(shí)會(huì)有一個(gè)屬性code(錯(cuò)誤碼)保存在FileReader的error屬性里面的一個(gè)對(duì)象中。
使用FileReader做上傳預(yù)覽的例子:


HTML:

<label class="item_label">上傳照片:
 <span style="width: 100px; height: 100px;border:1px solid #ccc; display:inline-block"><img src="#" id="uploadPreview" style="width: 100%; height: 100%;"></span>
 <input type="file" name="file" id="postFile" style="width:74px;">
 <span id="error_text" style="display: none;">提示</span>
</label>
  
JavaScript:

document.getElementById('postFile').onchange = function() {
 var val = this.value;
 var upLoadType = '.jpg,.gif,.bmp,.png';//['.jpg','.gif','.bmp','.png']; //可上傳的格式
 var fileExt = val.substr(val.lastIndexOf(".")).toLowerCase(); //從字符串中抽出最后一次出現(xiàn).之后的字符,并且轉(zhuǎn)換成小寫
 var result = upLoadType.indexOf(fileExt); //查找后綴名是否符合條件,如果符合返回>=0,如果不符合則返回負(fù)數(shù);
 _alertMsg = $('#error_text');
 var oFReader = new FileReader();
 if (this.files.length === 0) { return; }
 var oFile = this.files[0]; //如果只有一個(gè)文件則只需要訪問這個(gè)FileList對(duì)象中的第一個(gè)元素.
   
 if (oFile.size / 1024 < 100) {
  _alertMsg.html("<font style='color:blue'>√</font>").show()
 };
 if (result < 0) {
  _alertMsg.html("請(qǐng)輸入正確格式:" + upLoadType).show();
 } else{
  _alertMsg.html("<font style='color:blue'>√</font>").show();
 };
  
 oFReader.readAsDataURL(oFile); // 開始在后臺(tái)進(jìn)行讀取操作。當(dāng)圖像文件的所有內(nèi)容加載后,他們轉(zhuǎn)換成一個(gè)data:URL,傳遞到onload回調(diào)函數(shù)中
 oFReader.onload = function (oFREvent) { //當(dāng)讀取操作成功完成時(shí)調(diào)用.
  document.getElementById("uploadPreview").src = oFREvent.target.result;
 };
};


效果以及返回的圖片URL:




JavaScript獲取當(dāng)前運(yùn)行腳本文件所在目錄的方法


代碼如下:


DirectoryUtility = {
  // function getCurrentDirectory: returns currentDirectory path 
  // with a trailing backslash.
  getCurrentDirectory : function ( ) {
    var scriptFullName = WScript.ScriptFullName;
    var scriptName = WScript.ScriptName;
    return scriptFullName.substr ( 0, scriptFullName.lastIndexOf ( scriptName ) );
  }
}
/* 用法 */
DirectoryUtility.getCurrentDirectory ( );




Javascript中使用A標(biāo)簽獲取當(dāng)前目錄的絕對(duì)路徑方法


一談到路徑相關(guān)的問題,大家都會(huì)往window.location上想,確實(shí)這個(gè)對(duì)象提供了相當(dāng)多的路徑信息,其中常用的就包括:

1.location.href:當(dāng)前頁(yè)面的完整URL
2.location.pathname:當(dāng)前URL中的路徑名
3.location.hash:當(dāng)前URL中的錨點(diǎn)
4.location.search:當(dāng)前URL中的查詢參數(shù)

然而,location沒有一個(gè)屬性能直接獲得當(dāng)前目錄(不含文件名)的絕對(duì)路徑。通過(guò)Google我發(fā)現(xiàn)了一些錯(cuò)誤的方法,比如說(shuō)把URL通過(guò)“/”分離成數(shù)組,把數(shù)組的最后一項(xiàng)去掉以后再連接成字符串。但如果URL中沒有指定文件名,結(jié)果就大錯(cuò)特錯(cuò)了。

根據(jù)以往編碼的經(jīng)驗(yàn),a元素的href屬性總是會(huì)返回絕對(duì)路徑,也就是說(shuō)它具有把相對(duì)路徑轉(zhuǎn)成絕對(duì)路徑的能力。使用下面的代碼嘗試了一下,果然成了:


代碼如下:

var a = document.createElement('a');
a.href = './';
alert(a.href);
a = null;

很不幸地,此方法在老舊的IE 6/7下無(wú)效,當(dāng)執(zhí)行alert(a.href)時(shí),彈出的仍然是“./”。后來(lái),我發(fā)現(xiàn)在Stackoverflow上也有人提出了這個(gè)問題,而解決方法也是很簡(jiǎn)單的,只要把a(bǔ)通過(guò)innerHTML注入就可以了:

代碼如下:

var div = document.createElement('div');
div.innerHTML = '<a href="./"></a>";
alert(div.firstChild.href);
div = null;



javascript獲取web應(yīng)用根目錄的方法

代碼如下:

<script> 
function getRootPath(){ 
var strFullPath=window.document.location.href; 
var strPath=window.document.location.pathname; 
var pos=strFullPath.indexOf(strPath); 
var prePath=strFullPath.substring(0,pos); 
var postPath=strPath.substring(0,strPath.substr(1).indexOf(‘/')+1); 
return(prePath+postPath); 

var webpath=getRootPath(); //webpath就是目錄路徑變量 
</script> 



JavaScript獲取當(dāng)前運(yùn)行腳本文件所在目錄的方法

代碼如下:

DirectoryUtility = {
  // function getCurrentDirectory: returns currentDirectory path 
  // with a trailing backslash.
  getCurrentDirectory : function ( ) {
    var scriptFullName = WScript.ScriptFullName;
    var scriptName = WScript.ScriptName;
    return scriptFullName.substr ( 0, scriptFullName.lastIndexOf ( scriptName ) );
  }
}
/* 用法 */
DirectoryUtility.getCurrentDirectory ( );







以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)