2012-12-24 66 views
0

可能重复:
How can the file extension be validated in an input type file using JQuery?文件扩展验证

这是我的文件扩展名的验证码,以防止不必要的文件上传

有一个更简单的方法代码呢?

任何人都可以在这个改进?

<script> 
function onSubmitForm(re) { 
    var formDOMObj = document.frmSend; 
    var file1 = formDOMObj.attach1.value; 

    var pdf=file1.toLowerCase().lastIndexOf(".pdf"); 
    var doc=file1.toLowerCase().lastIndexOf(".doc"); 
    var docx=file1.toLowerCase().lastIndexOf(".docx"); 
    var xls=file1.toLowerCase().lastIndexOf(".xls"); 
    var xlsx=file1.toLowerCase().lastIndexOf(".xlsx"); 
    var wps=file1.toLowerCase().lastIndexOf(".wps"); 


    if (file1 == "") 
    { 
     alert("Please pick a file.") 
     return false; 
    } 
    else 
    if (pdf == -1 && doc == -1 && docx == -1 && xls == -1 && xlsx == -1 && wps == -1) 
    { 
     alert("File not acceped. Please upload your RESUME in .pdf, .doc, or docx") 
     frmSend.reset(re); 
     return false; 
    } 
    else 
     return true; 
} 
</script> 
+4

一定要验证服务器上也;攻击者可能会禁用您的客户端验证代码并上传受限制的文件。 – voithos

+0

此外,http://stackoverflow.com/questions/5796537/input-type-file-limit-selectable-files-by-extensions – tvanfosson

+0

尽管如此,如果你有事情以这样的方式建立一个恶意上传居然可以引起问题,你有更大的问题。 (回复:@voithos’评论) – Ryan

回答

2

正则表达式很强大。

function onSubmitForm(re) { 
    var formDOMObj = document.frmSend; 
    var file1 = formDOMObj.attach1.value; 

    var acceptedTypes = ["pdf", "doc", "docx", "xls", "xlsx", "wps"]; 
    var re = new RegExp("\\.(" + acceptedTypes.join("|") + ")$"); 

    if (file1 == "") 
    { 
     alert("Please pick a file.") 
     return false; 
    } 
    if (!re.test(file1)) 
    { 
     alert("File not acceped. Please upload your RESUME in .pdf, .doc, or docx") 
     frmSend.reset(re); 
     return false; 
    } 
    return true; 
}​ 
+0

应该不就是're.test(文件1)'!? – C5H8NNaO4

+0

是的,它应该。更新,谢谢。 –

+0

可能要之前有没有包括'\ .',只是为了确保'.rdoc'(或其它)的文件是不能接受的。 (不是真的为客户端验证一个大问题,虽然。) – Ryan

1

你并不需要此代码使用您的标签内接受

<input type="file" accept="application/pdf,application/msword"> 
+2

'accept'应该包含MIME类型,不能扩展。 – Ryan

+0

我的错,修正,感谢@minitech – HMarioD

+1

和:更加友好的操作不依赖于文件扩展名来确定文件类型的系统。 – Arjan

0

你也可以扩展分配给var和 就可以做一个开关的情况下,这种办法可以处理不同动作太多,如果你曾经想,这就是另一种可能的解决方案更短

function onSubmitForm(re) { 
    var formDOMObj = document.frmSend; 
    var file1 = formDOMObj.attach1.value; 
    var ext = file1.match(/\.(.+?)$/) 
    ext = ext == null ?"NONE": ext.ext[1].toLowerCase(); 

    switch (ext) { 
     case "": 
      alert("Please pick a file.") 
      return false; 
     case "pdf": 
     case "doc": 
     case "docx": 
     case "xls": 
     case "xlsx": 
     case "wps": 
      return true; 
     default: 
      alert("File not acceped. Please upload your RESUME in .pdf, .doc, or docx") 
      frmSend.reset(re); 
      return false; 
    } 

} 
+0

如果没有扩展名的文件上传? – Arjan

+0

您可能要添加索引 –

+0

@fastreload THX前的空检查,只是意识到了这一点,长度检查将做精,是不是? @ Arjan 它会运行在默认情况下 – C5H8NNaO4

4

为了简化:

var extension = file1.split('.').pop().toLowerCase(); 
var allowed = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'wps']; 

if(allowed.indexOf(extension) === -1) { 
    // Not valid. 
} 

当然,文件不一定包含它的扩展名表示它包含什么。

+2

+1'.split()。流行的instad()'得到扩展 – C5H8NNaO4

+0

我想你可以删除' xlsx' ... ;-) – Arjan

+0

@Arjan:...为什么?这是'allowed.indexOf',顺便说一下:) – Ryan

0

我认为它更易于只使用一个正则表达式直读:

function onSubmitForm(re) { 
    var formDOMObj = document.frmSend; 
    var file1 = formDOMObj.attach1.value; 

    if (file1 == "") 
    { 
     alert("Please pick a file.") 
     return false; 
    } 
    if (!/\.(doc|docx|pdf|wps|xls|xlsx)$/.test(file1)) 
    { 
     alert("File not acceped. Please upload your RESUME in .pdf, .doc, or docx") 
     frmSend.reset(re); 
     return false; 
    } 
    return true; 
} 
+0

我不知道别人,但这次真的说_“文件1与.doc或.DOCX或.pdf格式的结束......” _更清楚地比一些更简洁的答案。 –