MultipartFile字节表示

时间:2014-09-01 14:40:12

标签: java spring spring-mvc

我正在尝试上传图片并进行验证,检查第一个字节,以便检测图像的格式(在我的情况下为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(),但它没有帮助。 我真的很感激任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

您需要考虑代表性的差异。使用System.out.println()(或调试器)时,您会看到有符号字节的十进制表示形式。在十六进制编辑器中,您会看到十六进制相同的内容。

你如何检查"匹配"你的代码?

编辑: 将字节与int文字进行比较(这就是0x符号与编译器的关系)需要用0xFF屏蔽字节(以抑制符号扩展;编译器将字节转换为int以进行比较。这就是java如何使用带符号的字节类型)。

表达比较的可能方式是(byteArray[] & 0xFF) == 0xXXbyteArray[] == (byte) 0xXX。只写byteArray[] == 0xXX意味着字面上符号将字节扩展为int,然后与int literal进行比较