背景
通常情况下,我们取文件的后缀名作为文件的类型即可,但有时为了防止用户随便修改后缀名,就需要获取文件的真实类型。这时候可以通过文件的魔数来判别。魔数就是文件开头的那几个字节的数据。
代码实现
工具类代码
import java.util.HashMap;
import java.util.Map;
public class MagicNumberUtils {public static final Map<String, String> TYPES &#61; new HashMap<>();static {TYPES.put("FFD8FF", "jpg");TYPES.put("89504E", "png");TYPES.put("474946", "gif");TYPES.put("524946", "webp");}public static String getFileType(byte[] data) {String magicNumberHex &#61; getHex(data, 6);return TYPES.get(magicNumberHex);}public static String getHex(byte[] data, int magicNumberLength) {StringBuilder magicNumber &#61; new StringBuilder();int magicNumberByteLength &#61; magicNumberLength / 2;for (int i &#61; 0; i < magicNumberByteLength; i&#43;&#43;) {magicNumber.append(Integer.toHexString(data[i] >> 4 & 0xF));magicNumber.append(Integer.toHexString(data[i] & 0xF));}return magicNumber.toString().toUpperCase();}}
单元测试类
import com.kalikali.userbiz.util.MagicNumberUtils;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
&#64;SpringBootTest
public class MagicNumberUtilsTests {public static byte[] getFileBytesData(String filePath) throws IOException {InputStream fs &#61; new FileInputStream(filePath);byte[] b &#61; new byte[fs.available()];fs.read(b);return b;}&#64;Testpublic void getFileType() throws Exception {System.out.println(MagicNumberUtils.getFileType(getFileBytesData("src/test/resources/images/1.jpg")));System.out.println(MagicNumberUtils.getFileType(getFileBytesData("src/test/resources/images/2.jpg")));System.out.println(MagicNumberUtils.getFileType(getFileBytesData("src/test/resources/images/1.png")));System.out.println(MagicNumberUtils.getFileType(getFileBytesData("src/test/resources/images/1.gif")));System.out.println(MagicNumberUtils.getFileType(getFileBytesData("src/test/resources/images/3.gif")));System.out.println(MagicNumberUtils.getFileType(getFileBytesData("src/test/resources/images/1.webp")));}
}
运行结果
如果需要判断其他类型文件的真实类型&#xff0c;可以自行添加完善 魔数-类型 map.