2012-09-04 101 views
0

所以,我要做的是在發送到服務器端(PHP)的其他驗證之前使用javascript/jquery驗證文件擴展名。Javascript擴展驗證

我知道在這裏有很多來源,但是,我試圖以我自己的方式。

我到達一個簡單的IDEIA,像上面的代碼:

// remove all elements to take only the file name 
var fileName  = $('input[type=file]').val().split('\\').pop().toLowerCase(); 
    validExtension = ['.jpg', '.png', '.gif','.jpeg']; // list of valid extensions 

$.each(validExtension, function (e, val) { // run thru all valid extensions 
    if (fileName.indexOf(val) !== -1) { // if found a valid one, stop validation. 
     invalidExt = false; 
     return false; 
    } else { // else, error true... 
     invalidExt = true; 
    } 
}); 

if (invalidExt) { 
    alert('error'); 
}else{ 
    alert('success'); 
} 

的問題是,如果文件有.jpg或類似desert.jpg.exe名稱的中間任何其他有效的擴展,驗證將通過通。那麼,我該如何解決這個問題?

也許找到一種方法來獲取文件名的最後一個擴展名?

當然,任何提示,做我的客人。

謝謝。

回答

3

以下是我會做:

var validExtensions = { 
    jpg: true, 
    jpeg: true, 
    png: true, 
    gif: true 
}; 


var filename = $('input[type=file]').val().toLowerCase(); 

if (!validExtensions[filename.substr(filename.lastIndexOf('.')+1)]) { 
    alert('Invalid extension'); 
} 
  • 把有效擴展中的對象爲您提供快速(O(1))查找時間。
  • 使用lastIndexOf獲取文件名中的最後一段。這樣,無論之前發生了什麼,您都一直在查看擴展。
+0

不錯的一個,你爲什麼要設置爲+1? –

+0

''a.b'.lastIndexOf('。')== 1'; ''a.b'.substr(1)=='.b''。添加1可以消除這個時間段。 – josh3736

0

沒有jQuery的:

var filename = "photo.exe.jpg"; 

var validExtensions = ['jpg', 'png', 'gif', 'jpeg']; 
var filenameLowerCase = filename.toLowerCase(); 
var isValid = false; 

for(var i=0; i<validExtensions.length; i++) 
    if(filenameLowerCase.indexOf(validExtensions[i], filenameLowerCase.length - validExtensions[i].length) !== -1) 
     isValid = true;