2017-06-05 91 views
0

我在使用regEx在java中验证文件名 的覆盖问题。在我的应用程序支持.pdf,.txt,csv等。我的 文件名从用户获取为xxx.txt。我想验证我的文件名 以适当的扩展名格式,并且不包含任何特殊字符,其他 比点(例如.txt)。如何在java中验证文件名

filePath = properties.getProperty("DOCUMENT.LIBRARY.LOCATION"); 
String fileName = (String) request.getParameter("read"); 

只有如果文件路径完成了其正确的验证,下面的代码应该是工作。

filePath += "/" + fileName; 
+0

您可以使用正则表达式。 https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html – amiramw

回答

0

看一看String.endsWith()方法

if (fileName.endsWith(".pdf")) { 
    // do something 
} 

或者使用方法String.matches()

fileName.matches("\\.(pdf|txt|csv)$") 
+0

据我所知。 String#matches()匹配整个事物,所以你必须做'。+(pdf | txt | csv)'。如果我错了,请纠正我。 – ArsenArsen

+0

'String#matches()'匹配一个正则表达式,我写的正则表达式匹配任何带有'.'(点号字符)的字符串,列表中的一个扩展名为'(pdf | txt | csv)',美元符号'$')与行尾相匹配。看看这个https://regex101.com/r/lHkU3N/1/ – freedev

+0

我其实是对的,只是继续前进并检查。你也可以看一下,https://i.arsenarsen.com/dbgoy1wmui.png – ArsenArsen

0

这是一个可怕的答案,因为它仅验证文件名与所需的扩展名结尾,但不会验证原始问题中请求的文件名的其余部分。更多的东西这样会更好:

fileName.matches("[-_. A-Za-z0-9]+\\.(pdf|txt|csv)"); 

这保证了文件名只包含一个或多个 - ,_,周期,空间或字母数字字符,然后.PDF,.txt或.csv的只有一个在文件名的末尾。您的系统可能允许其他字符在文件名中,如果需要,您可以将它们添加到此列表中。另一种,不太安全的方法是防止“坏”字是这样的:

fileName.matches("[^/\]+\\.(pdf|txt|csv)"); 

它只是防止/或\字符从所需的结束扩展之前的文件名是。但是这并不能防止潜在的其他危险字符,例如NULL字节。