openSUSE之PHP学习之旅(9、上传并解压)
曾在openSUSE之PHP学习之旅(4、文件上传)一文介绍过文件上传的方法。是采用move_uploaded_file来上传。
本次要做的是上传并解压文件,原理就是上传后在调用命令进行解压。当然我们依然可以利用move_uploaded_file来实现上传,不过本次在Linux,我们利用copy命令来实现。
我们可以先以ROOT的身份登录,或者在终端从普通用户切换,不过注意要用:su - (中间有空格,这样保证不会因root读取普通用户的变量而出错,比如用gedit的时候会报错GLib-GIO:ERROR:gdbusconnection.c:2279:initable_init: assertion failed: (connection->initialization_error == NULL)
我们先在创建一个目录upload
linux-4k5v:mkdir /srv/www/htdocs/upload/
linux-4k5v:chmod 777 /srv/www/htdocs/upload/ (必须设置好权限,以免上传失败)
创建一个文件:upload.php
代码说明:把文件上传自linuxsight文件夹里并解压。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" <html> <body> <?php if (isset($_POST['submit'])){ $tname=$_FILES['upfile']['tmp_name']; //获取上传文件的临时路径 $nname=$_FILES['upfile']['name']; //获取上传文件的名称 echo "路径:".$tname."<br />"; echo "名字:".$nname."<br />"; $path_info = pathinfo($nname); echo "文件后缀:".$path_info['extension']."<br />"; if(!is_dir("linuxsight")) { mkdir("linuxsight"); //创建目录 chmod("linuxsight",0777);//改变权限 } if($path_info['extension']=='zip'){ copy($tname,"linuxsight/temp.zip");//复制文件 exec("unzip -o linuxsight/temp.zip -d linuxsight/");//解压zip exec("rm -f linuxsight/temp.zip");//删除 }else{ copy($tname,"linuxsight/temp.tar.gz");//复制文件 chdir("linuxsight");//更改执行目录 exec("tar -zxvf temp.tar.gz");//执行目录在当前,不需路经 exec("rm -f temp.tar.gz"); //删除 chdir("../"); } //move_uploaded_file($tname,'linuxsight/'.$nname); echo "上传成功"; } ?> <form method="post" action="" enctype="multipart/form-data"> <input type="file" name="upfile" size="20"> <input type="submit" name="submit" value="上传并解压"> <input type="reset" value="取消"> </form> </body> </html>
Linux最常见的压缩包是:zip和tar.gz 所以此代码也只是针对这2种情况。
(注:由于书写不规范而出现:Use of undefined constant - assumed 如果想去掉此报错,在代码开头加上 error_reporting(E_ERROR | E_WARNING | E_PARSE);)
附:windows下rar的解压:(使用PHP 预定义的Com组件加载Shell 命令:winrar x 被解压文件 加压的位置)
$tname=$_FILES['upfile']['tmp_name']; //获取上传文件的临时路径 $nname=$_FILES['upfile']['name']; //获取上传文件的名称 $dir=getcwd(); move_uploaded_file($tname,$nname);//移动文件 $obj=new com("wscript.shell");//加载组件 获得解压 echo "winrar x $dir".$nname." ".$dir; $obj->run("winrar x $dir".$nname." ".$dir ,1,true);//上传解压文件 unlink($nname);//删除文件