2017-06-05 38 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字節。