2013-03-29 33 views
0

使用正则表达式来确保通过input[type="file"]上传的文件是MP3。有些事情出错了,我正在测试的文件没有通过。jQuery检查文件上传是否为mp3

感谢您的帮助!

HTML

<input type="file"/> 

的JavaScript

var file = $input.find('input[type="file"]'), 
    val = file.val(), 
    type = /^([a-zA-Z0-9_-]+)(\.mp3)$/; 

submit.attr('disabled', 'disabled').addClass('deac'); 

if (!val){ 

    modal("The upload can't be empty.", true); 
} else if (!type.test(val)){ 

    modal("The song must be in MP3 format.", true); 

    /*********** 
    * 
    * Getting caught here- even with a valid .mp3 file that _should_ pass the regex 
    * in my test case using mamp as a localhost, val = C:\fakepath\1.mp3 
    * 
    ***********/ 
} else { 

    /* Success */ 
} 
+1

如果“VAL”为“C:\ fakepath \ 1.MP3” ,那么很明显为什么它没有通过 - 正则表达式不允许“:”或“\”。 – Pointy

+0

此外,你可能应该允许大写“MP3”,以防有人从FAT文件系统上传。 (当然你的服务器应该检查实际的文件内容,如果确保只有真正的MP3文件上传真的很重要;文件名可以被简单地欺骗。) – Pointy

+0

@Pointy正则表达式的方式超出了我,他们看起来像胡言乱语。请在下面回答一个建议,以便我可以给你信用,并把这一个从我的名单中删除? – technopeasant

回答

0

我认为IE是,增加了像“fakepath”前缀任何唯一的浏览器,所以这样的事情可能会更好地工作:

type = /^(?:[A-Z]:\\fakepath\\)?([a-zA-Z0-9_-]+)(\.[Mm][Pp]3)$/; 
+0

没有骰子 - 获取本地和托管相同的故障。 fwiw它看起来像Val仍然包括服务器上的假路径地址 – technopeasant

+0

@technopeasant是的,没有什么可以做的不幸的事情 - 让我检查正则表达式,我会更新 – Pointy

+0

@technopeasant抱歉,我跳过了一个反斜杠。现在我想到了,在服务器上获取“fakepath”部分似乎有点奇怪;我必须检查我自己的代码,看看我是否曾经这样做过。 – Pointy

1

我认为最好的办法是使用方法mime()

这样,即使文件被重命名为a。 Mp3没有规避控制权。

+0

不错的主意,只是犹豫,包括一个简单的检查sdk – technopeasant

+0

你是对的! '('input [type =“file”]')。prop('files')[0] .file;''提取文件的MIME类型,你可以检查它。 这样你就不必导入所有的sdk! – Lughino

+0

@ loughino返回未定义的本地和托管 – technopeasant

相关问题