为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查文件是否为图像

如何检查文件是否为图像

噜噜哒 2021-09-15 14:49:56
所以我有一个检查文件类型的功能,我正在通过签名检查文件,但对于 GIF 文件它不起作用 def checkPhotoType(file: File): Option[String] = {    val param = new DataInputStream(new BufferedInputStream(new FileInputStream(file)))    if (param.readInt() == 0xFFd8FFe0 | param.readInt() == 0xFFd8FFe1 )      Some("jpg/jpeg")    if(param.readInt() == 0x474946383961L)      Some("gif")    else None
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

这段代码有多个问题:

  1. Int每次做测试时,您都在阅读新内容

  2. 您正在尝试Int针对 6 字节值测试 4字节

  3. 字节顺序在小端处理器上是错误的

下面是一个示例,说明如何构造此代码。

def checkPhotoType(file: File): Option[String] = {

  val param = new DataInputStream(new BufferedInputStream(new FileInputStream(file)))


  val bytes = (1 to 6).map( _ => param.readByte).toList


  bytes match {

    case List(0xFF, 0xD8, 0xFF, 0xDB, _, _) =>

      Some("jpg/jpeg")

    case List(0x47, 0x49, 0x46, 0x38, 0x37, 0x61) =>

      Some("GIF87a")

    case List(0x47, 0x49, 0x46, 0x38, 0x39, 0x61) =>

      Some("GIF89a")

    case _ =>

      None

  }

}


查看完整回答
反对 回复 2021-09-15
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

if (param.readInt() == 0xFFd8FFe0 | param.readInt() == 0xFFd8FFe1 )

  Some("jpg/jpeg")

if(param.readInt() == 0x474946383961L)

  Some("gif")

你继续int从param. 把它放在一个变量中:


int magic = param.readInt();

if (magic == 0xFFd8FFe0 | magic == 0xFFd8FFe1 )

  Some("jpg/jpeg")

if(magic == 0x474946383961L)

  Some("gif")

尽管正如DawoodIbnKareem指出的那样,magic == 0x474946383961L永远不会为真,因为常量是 int 范围之外的 long 值。所以,你需要读取更多的数据来匹配这个。


查看完整回答
反对 回复 2021-09-15
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

除了第一个答案之外,您还可以将十六进制字符串转换为整数,如下所示:

String hex = "aa"
int value = Integer.parseInt(hex, 16);

或更大的数字

BigInteger bigValue = new BigInteger(hex, 16);


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信