当前位置: 首页 > Web前端 > HTML5

下载文件时MD5校验

时间:2023-04-05 10:57:38 HTML5

后台项目中发现下载文件时可能会因为文件不完整而打不开文件。考虑在后台响应中加入文件MD5,前台获取文件后生成的文件。检查一次MD5值,判断文件是否下载正确。这个函数的难点在于如何在响应中添加MD5值。原来的文件下载接口使用了HttpServletResponse,然后在前台使用了某个标签的点击事件来实现。在开发过程中,首先想到的就是在响应的headers中加入MD5信息,然后想办法在前台获取,即。..//response.setHeader("md5",md5sum(bytes));...privateStringmd5sum(byte[]bytes){...}在实际开发中发现该方法无法正常下载文件,所以它应该通过其他方式来实现。(这种想法还是很幼稚2333)之前开发的方案中使用了Blob对象,前台可以使用Blob对象实现文件下载,即...varurl=window.URL.createObjectURL(blob);vara=document.createElement('a');a.href=url;a.download=filename;a.click();...那么肯定可以把文件的bytearray加上后台界面,然后在JS中使用varblob=newBlob([bytearray]);声明一个blob对象来实现文件下载,那么也可以将生成的MD5值添加到返回的JSON中。代码后台importorg.apache.commons.io.IOUtils;importjava.util.HashMap;importjava.util.Map;importjava.io.*;importjava.security.MessageDigest;...privatefinalcharHEX_DIGITS[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};...@OverridepublicObjectdownloadFile(StringburketName,StringfileName){try{InputStream=...;byte[]byteArray=IOUtils.toByteArray(is);字符串fileMD5=md5sum(byteArray);映射map=newHashMap();map.put("文件",byteArray);map.put("md5",fileMD5.toUpperCase());if(is!=null){is.close();}返回地图;}catch(Exceptionex){ex.printStackTrace();}返回””;}privateStringtoHexString(byte[]b){StringBuildersb=newStringBuilder(b.length*2);for(inti=0;i>>4]);sb.append(HEX_DIGITS[b[i]&0x0f]);}返回sb.toString();}privateStringmd5sum(byte[]byteArray){InputStreamis=newByteArrayInputStream(byteArray);字节[]缓冲区=新字节[1024];intnumRead=0;消息摘要md5;尝试{md5=MessageDigest.getInstance("MD5");while((numRead=is.read(buffer))>0){md5.update(buffer,0,numRead);}返回到HexString(md5.digest());}catch(Exceptione){System.out.println("解析md5错误");返回空值;}}...Foreground...//前台在生成MD5时使用SparkMD5插件fetch(url,{headers:headers).then(function(res){returnres.json();})。then(function(blob){varspark=newSparkMD5.ArrayBuffer();//这个是接口返回的MD5varserverMD5=blob.md5;varbyteBuffer=_base64ToArrayBuffer(blob.file);spark.append(byte缓冲);varclientMD5=spark.end().toUpperCase();//判断文件是否下载完整if(serverMD5===clientMD5){varf=newBlob([byteBuffer]);varurl=window.URL。createObjectURL(f);vara=document.createElement('a');a.href=网址;a.download=文件名;a.点击();window.URL.revokeObjectURL(f);}else{console.log("下载文件出错,请重新下载");}});函数_base64ToArrayBuffer(base64){varbinary_string=window.atob(base64);varlen=binary_string.length;varbytes=newUint8Array(len);对于(vari=0;i