PHP文件上传与下载
/*
PHP文件上传与下载
1、将文件上传至服务器,获取文件及文件名、文件大小等
2、将文件名、大小等存入数据库中,再随机生成一个新文件名存入系统
3、下载时通过数据库获取文件的原名及路径,动态读取并推送到浏览器提供下载
4、这样没有文件路径,不会被盗下。
*/
public function uploadSorft(){
//p($_POST);
//p($_FILES);
$file = $_FILES['file']['tmp_name']; //接收上传的文件
if (empty ($file)) {echo '请选择要上传文件!';return; }
$filename=$_FILES['file']['name'];
$newname=rand(10000,20000);//生成一个10000到20000的随机数,作为新文件的名称
$filePath=ROOT_PATH.DS.'uploadFold';
while(true){ // 检查文件名是否重复,如果重复就再重新生成一个
if(!file_exists($filePath.DS.$newname)){
break;
}else{
$newname=rand(10,15);
}
}
$filePath=$filePath.DS.$newname;
copy($file,$filePath);//将临时文件复制到指定目录
$name=trim($_POST['name']);
$kind=trim($_POST['kind']);
$os=trim($_POST['os']);
$miaosh=trim($_POST['miaosh']);
$Dbkind=Db::table('sorftKind')->where('name',$kind)->count('id');
if($Dbkind < 1){
Db::table('sorftKind')->insert(['name'=>$kind]);
}
$kind=Db::table('sorftKind')->where('name',$kind)->first()['id'];
$Dbos=Db::table('os')->where('name',$os)->count('id');
if($Dbos < 1){
Db::table('os')->insert(['name'=>$os]);
}
$os=Db::table('os')->where('name',$os)->first()['id'];
$back=Db::table('download')->insert(['name'=>$name,'fileName'=>$filename,'kind_id'=>$kind,'os_id'=>$os,'miaosh'=>$miaosh,'filePath'=>$filePath]);
//if($back){echo 'true';}else{echo 'false';}
go("jk/index/uploadSorft");
exit();
}
public function downLoad(){
$sorftArr=$sorft=Db::table('download')->where('id',$_GET['id'])->first();
$fp=fopen($sorftArr['filePath'],"r");
$file_size=filesize($sorftArr['filePath']);
header("Content-type:application/octet-stream");
header("Accept-ranges:bytes");
header("Accept-length:$file_size");
header("Content-Disposition:attachment;filename=".$sorftArr['fileName']);
$buffer=1024;
$file_count=0;
while (!feof($fp)&&$file_size-$file_count>0) {
$file_data=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_data;
}
fclose($fp);
}