可以說我的Java代碼的輸入是一個jpeg文件。如何在啓動過程之前驗證它是否具有有效的擴展名。有時用戶上傳一個擴展名爲pdf格式的pdf文件,導致代碼崩潰。如何驗證具有有效擴展名的文件?
有一點幻數與每個文件。但是有沒有其他辦法來解決這個問題。
可以說我的Java代碼的輸入是一個jpeg文件。如何在啓動過程之前驗證它是否具有有效的擴展名。有時用戶上傳一個擴展名爲pdf格式的pdf文件,導致代碼崩潰。如何驗證具有有效擴展名的文件?
有一點幻數與每個文件。但是有沒有其他辦法來解決這個問題。
檢查文件簽名:
http://www.filesignatures.net/index.php?search=JPEG&mode=EXT
http://en.wikipedia.org/wiki/List_of_file_signatures
您可以通過閱讀幾個字節驗證文件類型。
問候。
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指定的點可以幫助。
如果你只想檢查文件名,你可以這樣做:
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
你不能確定一個文件的類型,除非你完全解析文件,並驗證它完全堅持格式規範。只有當你可以肯定。
檢查幻數是以高概率正確檢測類型的快速方法。但顯然它不是萬無一失的,它很容易製作一個以字節FF D8 FF開頭的文件,它看起來像一個jpeg,但顯然不能保證它真的是一個jpeg。
或者只是依靠文件擴展名。
你只需要在可靠性和簡單性之間進行交易。如果你想要簡單,請相信文件擴展名。如果您想要安全,請驗證文件內容。
嗯,至少他知道如果幻數不正確,它不是JPEG。所以意外更換可以很好地處理。這並不能防止惡意僞造的JPEG,並且所有您說的都適用。 – Ingo
'.toString()。endsWith(SOMETHING)'? – Maroun
但是如果用戶給了我一個「.jpeg」文件,這個文件實際上只是一個擴展名爲pdf的文件。 –