让我们说我的Java代码的输入是一个jpeg文件。如何在启动输入之前验证输入是否具有有效的扩展名。有时用户上传一个pdf文件,其扩展名被修改为jpeg,从而导致代码崩溃。
每个文件都有幻数。但是有没有办法解决这个问题。
答案 0 :(得分: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 :(得分:1)
您无法确定文件类型,除非完全解析文件并验证它是否完全符合格式规范。只有这样你才能确定。
检查幻数是一种快速检查的方法,很有可能正确地猜测类型。但显然它不是万无一失的,它很容易制作一个以字节FF D8 FF开头的文件,看起来像是一个jpeg,但显然无法保证它真的是一个jpeg。
或者只是依赖文件扩展名。
您只需在可靠性和简单性之间进行交易。如果您想要简单,请信任文件扩展名。如果您想要安全,请验证文件内容。
答案 2 :(得分:1)
幻数解决方案已经实现:请参阅this topic以获取Java Mime Magic Library的链接。
答案 3 :(得分:0)
检查文件签名:
http://www.filesignatures.net/index.php?search=JPEG&mode=EXT
http://en.wikipedia.org/wiki/List_of_file_signatures
您可以通过读取几个字节来验证文件类型。
问候。
答案 4 :(得分:0)
一个。下面的这个功能将列出目录中的所有扩展名。您可以做的是列出所有文件并获取所有文件的扩展名,并可以检查哪些文件可以上传。您可以在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));
}
}
}
湾关于延期的错误,我没有经历过这样的情况。可能是eltabo指定的点可以提供帮助。