最近在使用阿里云的oss存储服务,上传文件后会传回文件的md5值,后台采用springmvc,遂下载md5工具类一个,发现校验都是采用java.io.File作为参数传入,而springmvc采用common-fileupload上传时返回的是org.springframework.web.multipart.MultipartFile,解决方案如下文:
最初是使用将MultipartFile.getgetInputStream()强制转换为FileInputStream传入工具类,果然成功了,但是后来发现了问题,在上传小文件的时候强制类型转换报错,说不能将ByteArrayInputStream 强制转换为FileInputStream,遂查看common-fileupload的官方文档以及源码,发现DiskFileItemFactory类中有一个方法为setSizeThreshold,注释为“存储在内存中的最大size”,不用想也知道了,springmvc肯定设定了这个值,具体是多少笔者没有深究。
遂采用如下方案解决:
public String test(MultipartFile upload) throws Exception { byte[] uploadBytes = upload.getBytes(); MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] digest = md5.digest(uploadBytes); String hashString = new BigInteger(1, digest).toString(16); return hashString.toUpperCase(); }
效率有些慢吧~
确实,并且我估计处理大文件会有问题,当时主要是为了上传小图片用的,没有那么大的业务量。就用了这种方式。现在已经不用阿里云的oss了[嘻嘻]
用bigInteger会有问题,首位为0的话会被略去