PHP文件上传下载及md5完整性验证【优化】
程序员文章站
2022-05-14 21:57:12
...
需求背景
- 由于设置的参数数据过多,以至于设备出厂后用户根据说明书设置数据比较繁琐。因此导入配置数据导入导出需求;
- 首先配置一台设备的配置参数,等该设备所有参数配置完成后,将此设备的设备参数以数据包.tar的形式导出;
- 再将数据包.tar导入进其他设备机器,一键自动设置相同参数。
技术重点与难点
- 功能1:配置参数以.tar数据包的形式从设备导出
- 功能2:配置参数以.tar数据包的形式从设备导入
- 功能3:导入前数据包的完整性验证,防止我们所需导入的数据包被篡改
- 功能4:数据包导入后内部逻辑功能一键设置导入参数
解决方案
- 功能1:导出页面以"<a>"标签的形式的href属性向后端逻辑传递参数;后端逻辑页面根据$_GET[]全局变量获取参数,设计逻辑自动根据当前设备配置参数生成conf.tar配置参数数据包;同时计算最新导出数据包conf.tar的MD5值,并将其保存在filemd5.txt中,同时以readfile()的形式导出文件。
前端向后端传递代码如下。
<a href="download.php?name=conf.tar&type=tar" class="btn btn-primary">配置导出</a>
后端导出文件逻辑代码如下。
$filename = $_GET['name'];
$filetype = $_GET['type'];
header("Content-Disposition:attachment;filename={$filename}");
header("Content-Type:{$filetype}");
header("Content_Length:".filesize($filename));
$filetxt = "conf/web.txt";
$filearm = "conf/arm.txt";
$cmd = "cp ".$filetxt." web.txt";
shell_exec($cmd);
$cmd = "cp ".$filearm." arm.txt";
shell_exec($cmd);
$cmd = "tar -cvf conf.tar web.txt arm.txt";
shell_exec($cmd);
$cmd = "rm web.txt";
shell_exec($cmd);
$cmd = "rm arm.txt";
shell_exec($cmd);
$oldmd5 = md5_file("conf.tar");
$filemd5 = "conf/filemd5.txt";
@file_put_contents($filemd5,$oldmd5);
readfile($filename);
- 功能2:前端页面以表单的形式向后端php文件提交表单数据,后端以$_FILES全局变量及move_uploaded_file()等方法实现数据包的上传
- 功能3:数据包的完整性验证以php文件调用自带函数库md5_file()方法获取导入后的数据包md5值,同时读取MD5文件中数据包conf.tar的md5值,并判断两者是否一致,若一致,则数据包完整,没有篡改。
- 功能4:数据包导入后一键参数设置根据php调用方法shell_exe()执行后台命令,将参数一键设置。
前端代码如下。
<form method="post" action="upload.php" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" if="file" />
<button type="submit" class="btn btn-primary">上传</button>
</form>
后端代码如下。
$filemd5 = "conf/filemd5.txt";
$oldmd5 = @file_put_contents($filemd5);
if($_FILE["file"]["error"]){
echo "错误".$_FILES["file"]["error"]."<br/>"
}
else{
if($_FILES['file']['name'] == 'conf.tar'){
if(move_uploaded_file($_FILES['file']['tmp_name'],"upload/".$_FILES['file']['name'])){
$newmd5 = md5_file("upload/".$_FILES['file']['name']);
if($oldmd5 = $newmd5){
$cmd = "tar -cvf upload/conf.tar";
shell_exec($cmd);
$cmd = "mv web.txt /conf/web.txt";
shell_exec($cmd);
$cmd = "mv arm.txt /conf/arm.txt";
shell_exec($cmd);
echo '<script>alert("文件上传成功!")</script>';
echo '<script>location.href="import.php"</script>';
}
else{
echo '<script>alert("文件完整性损坏,请重新上传!")</script>';
echo '<script>location.href="import.php"</script>';
}
}else{
echo '<script>alert("文件上传失败,请重新上传!")</script>';
echo '<script>location.href="import.php"</script>';
}
}else{
echo '<script>alert("请上传符合格式的文件!")</script>';
echo '<script>location.href="import.php"</script>';
}
}
最后推荐一个公众号,一枚IT技术人成长路上关于生活和职场的思考,欢迎书友们前来交流和分享心得。