我正在尝试上传图片并进行验证,检查第一个字节,以便检测图像的格式(在我的情况下为jpg或png)。我正在使用spring MultipartFile上传图片。维基百科说,.PNG有89 50 4E 47 0D 0A 1A 0A和.JPG分别有FF D8标记。我正在尝试获取MultipartFile中的图像字节:
CommonsMultipartFile logo = request.getFile('logo')...
byte[] byteArray = logo.getBytes();
但是当我调试时,我发现byteArray不包含这些掩码。例如,我尝试上传.JPG图像,第一个字节为-1 40,而.PNG的第一个字节为-119 80 78 71 13 10 26 10 0.但是,如果要保存图像,则会有什么意思:
logo.transferTo(new File(...))
到文件系统并用十六进制编辑器检查图像的字节表示然后一切正常 - 对于.PNG和.JPEG都有正确的字节标记(89 50 4E 47 0D 0A 1A 0A和FF D8)
我也尝试了logo.getFileItem().get()
而不是logo.getBytes()
,但它没有帮助。
我真的很感激任何帮助。谢谢!
答案 0 :(得分:1)
您需要考虑代表性的差异。使用System.out.println()(或调试器)时,您会看到有符号字节的十进制表示形式。在十六进制编辑器中,您会看到十六进制相同的内容。
你如何检查"匹配"你的代码?
编辑: 将字节与int文字进行比较(这就是0x符号与编译器的关系)需要用0xFF屏蔽字节(以抑制符号扩展;编译器将字节转换为int以进行比较。这就是java如何使用带符号的字节类型)。
表达比较的可能方式是(byteArray[] & 0xFF) == 0xXX
或byteArray[] == (byte) 0xXX
。只写byteArray[] == 0xXX
意味着字面上符号将字节扩展为int,然后与int literal进行比较。