项目中使用到了公司的S3服务,里面需要分片上传安装包文件,但是在某次上传的时候发现下载下来的安装包无法安装,提示已损坏,造成的后果就是周末两天 该渠道的下载量为0,流失了好多用户。然后惨兮兮。。
然后想了几个方案:
一、前端上传的时候带上分片上传前的文件大小,保存到后端数据库里,然后定时脚本每次去获取一下上传到S3的文件大小,比较文件大小是否一致,不一致则认为出现异常。代码如下:
function getResourceSize($url)
{
$header_array = get_headers($url, true);
$size = $header_array['Content-Length'];
return $size;
}
二、前端上传的时候计算每个分片的MD5值,最后得到整个文件的MD5值,同样还是保存到后端数据库,由脚本定时去检查上传到S3的文件的MD5值,比较是否一致即可,讲道理这个方案更靠谱一些。但是问题也有一些,前端每次上传的时候都需要计算所有分片的MD5信息,会增加上传的耗时。另一方面,后端这我一开始只知道linux 下有
md5sum
命令可以计算文件的md5信息。所以只能通过
exec('md5sum ');
这种比较简陋且危险的方式。而且这种方式每次我还得下载S3上的文件到服务器本地才可以。浪费内存资源。
三、最终方案 几经辗转,竟然发现PHP自带计算文件MD5信息的方法
md5_file()
不仅可以计算本地文件的,还可以计算远程网络资源的。这就避免了前面说的问题。
PS:提供一个前端计算文件MD5的方法,spark-md5 计算结果和md5sum 的效果是一样的。 9px.ir/demo/increm…