2014-01-14 43 views
0

可以說我的Java代碼的輸入是一個jpeg文件。如何在啓動過程之前驗證它是否具有有效的擴展名。有時用戶上傳一個擴展名爲pdf格式的pdf文件,導致代碼崩潰。如何驗證具有有效擴展名的文件?

有一點幻數與每個文件。但是有沒有其他辦法來解決這個問題。

+0

'.toString()。endsWith(SOMETHING)'? – Maroun

+0

但是如果用戶給了我一個「.jpeg」文件,這個文件實際上只是一個擴展名爲pdf的文件。 –

回答

1

幻數解決方案已經實現:請參閱this topic以獲取Java Mime Magic Library的鏈接。

+0

非常感謝您的評論。它幫助我很多。 –

0

a。下面的這個功能將列出目錄中的所有擴展名。你可以做的是列出所有文件,並獲得所有文件的擴展名,並可以檢查哪些文件可以上傳。您可以在UI上提供只允許使用.jpeg文件的客戶端驗證。

public static void main(String args[]) { 
     System.out.println("GET"); 
     File fileObj = new File("D:\\"); 
     File[] listAll = fileObj.listFiles(); 
     for (File file : listOfFiles) { 
     if (file.isFile()) { 
      System.out.println("Extension ."+file.getName().substring(file.getName().lastIndexOf('.')+1)); 
     } 
     } 
    } 

b。關於延誤的錯誤,我沒有經歷過這種情況。可能是由eltabo指定的點可以幫助。

3

如果你只想檢查文件名,你可以這樣做:

public boolean checkJPEG(File file) { 
    String fileName = file.getName().toUpperCase(); 
    return fileName.endsWith(".JPG") || fileName.endsWith(".JPEG"); 
} 

但這種方法只檢查文件名,而不是內容。更完整的方法包括幻數測試。

public boolean checkJPEG(File file) throws IOException { 
    String fileName = file.getName().toUpperCase(); 
    boolean extension = fileName.endsWith(".JPG") || fileName.endsWith(".JPEG"); 
    if (!extension) { 
     return false; 
    } 
    FileInputStream in = null; 
    try { 
     in = new FileInputStream(file) 
     byte[] magic = new byte[3]; 
     int count = in.read(magic); 
     if (count < 3) return false; 
     return magic[0] == 0xFF && magic[1] == 0xD8 && magic[2] == 0xFF; 
    } finally { 
     try { 
     if (in != null) in.close(); 
     } catch (IOException ex) {} 
    } 
} 

此文件簽名列表:http://en.wikipedia.org/wiki/List_of_file_signatures

1

你不能確定一個文件的類型,除非你完全解析文件,並驗證它完全堅持格式規範。只有當你可以肯定

檢查幻數是以高概率正確檢測類型的快速方法。但顯然它不是萬無一失的,它很容易製作一個以字節FF D8 FF開頭的文件,它看起來像一個jpeg,但顯然不能保證它真的是一個jpeg。

或者只是依靠文件擴展名。

你只需要在可靠性和簡單性之間進行交易。如果你想要簡單,請相信文件擴展名。如果您想要安全,請驗證文件內容。

+0

嗯,至少他知道如果幻數不正確,它不是JPEG。所以意外更換可以很好地處理。這並不能防止惡意僞造的JPEG,並且所有您說的都適用。 – Ingo

相關問題