博客列表 >文件上传,目录遍历操作0828

文件上传,目录遍历操作0828

郭稳重啊的博客
郭稳重啊的博客原创
2018年09月07日 12:39:401278浏览

0828作业


实例

<!-- 创建一个文件上传表单 -->
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST" enctype="multipart/form-data">
    <!-- 用隐藏域设置允许上传的文件大小,仅考参考 -->
    <input type="hidden" name="MAX_FILE_SIZE" value="542488">
    <fieldset>
        <legend align="center">文件上传</legend>
        <p><strong>选择文件:</strong><input type="file" name="upload"></p>
    </fieldset>
    <p align="center"><button type="submit" name="submit" >上传</button></p>
</form>

<?php
//检测请求类型是否POST,如果不是应该提示用户类型不对
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
    //检测是否有文件被上传,在php目录下面创建一个upload目录文件
    if (isset($_FILES['upload']))
    {
        //设置允许上传的文件类型
        $allow = ['image/jpg', 'image/jpeg', 'image/png'];
        //in_array() 函数搜索数组中是否存在指定的值,全局数组 $_FILES,
        if (in_array($_FILES['upload']['type'], $allow))
        {
            // $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
            $tmpFile=$_FILES['upload']['tmp_name'];//临时文件
            $destFile=$_FILES['upload']['name'];//目标文件
            //move_uploaded_file() 函数将上传的文件移动到新位置/临时目录。
            //move_uploaded_file(file,newloc)file必需,规定要移动的文件。newloc必需,规定文件的新位置。
            if (move_uploaded_file( $tmpFile, "upload/$destFile"))
            {
                //上传成功
                echo "<script>alert('文件上传成功')</script>";
            }
        }
        else {
            //提示格式不对
            echo "<script>alert('仅允许上传jpg和png格式的图片')</script>";
        }
    }
    //对上传错误进行处理
    if ($_FILES['upload']['error'] > 0) {
        echo '<p>错误原因是:<strong>';
        switch ($_FILES['upload']['error']) {
            case 1:
                echo '文件超过了php.ini配置中设置的大小';
                break;
            case 2:
                echo '文件超过了表单中常量设置的大小';
                break;
            case 3:
                echo '仅有部分文件被上传';
                break;
            case 4:
                echo '没有文件被上传';
                break;
            case 6:
                echo '没有可用的临时文件夹';
                break;
            case 7:
                echo '磁盘已满,写入失败';
                break;
            case 8:
                echo '上传意外中止';
                break;

            default:
                echo '系统未知错误';
                break;
        }
        echo '</strong></p>';
        //保险起见,最好把创建的临时文件删除,当然系统也会在结束会话时自动清空
        //file_exists() 函数检查文件或目录是否存在。file_exists(path) path检查的路径。
        //is_file() 函数检查指定的文件名是否是正常的文件
        if (file_exists($_FILES['upload']['tmp_name']) && is_file($_FILES['upload']['tmp_name']))
        {   //unlink() 函数删除文件。
            unlink($_FILES['upload']['tmp_name']);
        }
    }
}
else
 {
    echo '1';
 }
?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

S6ZN$J4CN}B4`UII3ZYFI)M.png



I91$2WB`LES~8(S))$D5FKT.png


实例

<?php
echo  '<h2>目录遍历操作: </h2>';

echo '<h4>方法1: 传统目录函数opendir(),readdir(),closedir()</h4>';
echo '<h6>(1)传统目录遍历切换到与当前父目录同级的目录</h6>';
// 1.opendir('目录')打开目录,成功返回资源,失败返回false
$dir = opendir('../static') or die('打开失败');
//2.readdir($dir)读取目录内容,成功返回文件名,失败返回false
while (false != ($file = readdir($dir))) {
    if ($file != "." && $file != "..") {
        print $file."<br>";
    }
}
//3.closedir($dir)关闭当前目录
closedir($dir);
echo '<hr>';

echo '<h6>(2)传统目录遍历打开到当前目录</h6>';
// 1.opendir('目录')打开目录,成功返回资源,失败返回false
 $dir=opendir("./") or die('打开失败');//.或./当前目录
//2.readdir($dir)读取目录成功且文件不为.或..时,输出$file
while(false !=($file=readdir())){
  if($file!="."&&$file!="..") {
      print $file.'<br>';
  }
}
//3.closedir($dir)关闭当前目录
closedir($dir);
echo '<hr>';

//第二种方式:将目录内容保存到数组中进行遍历
echo '<h4>方法2:目录扫描器: scandir()</h4>';
echo '<h6>(1)目录扫描器遍历切换到与当前父目录同级的目录</h6>';
//1.读到一个目录内容到数组中:
$fileArr = scandir('../static/');
// print_r($fileArr);
//2.遍历目录数组
foreach ($fileArr as $file) {
    if ($file != "." && $file != "..") {
        echo "$file.<br>";
    }
}
echo '<h6>(2)目录扫描器遍历打开到当前目录</h6>';
$fileArr=scandir(".");
foreach($fileArr as $file){
    if($file!="."&&$file!=".."){
        print $file.'<br>';
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

1X$U28SH8)IQQC7)[$NJE_T.png


总结:其实我不知道总结是啥,我要写点儿什么?是要写我对代码的理解还是哪里掌握的不好要反馈!!!

以下是我对文件上传的个人理解步骤:

1.首先需要建一个文件上传表单  

2.检测用户类型,其实就是使用post来获取表单内容,因为表单使用的method="POST"
,所以需要使用post来获取表单内容,并且post所能够传输的数据量较大

3.我们要上传文件,需要先创建一个保存文件的临时目录upload,$_FILES是一个超全局文件数组,所以每上传一个文件,$_FILES就会有其相关的信息,文件名,文件类型,等等,通过isset检测文件能否被上传,如果可以再对文件类型进行设置,从而将我要上传的文件移动到我创建的目录里面

4对于move_uploaded_file($_FILES['upload']['tmp_name'], "upload/{$_FILES['upload']['name']}"的理解

$_FILES['upload']['tmp_name']就是我要上传的临时文件,$_FILES['upload']['name']目标文件:其实就是要上传的文件名,所以每次上传成功的文件名会不一样,是根据$_FILES里面的name的而变化

"upload/{$_FILES['upload']['name'] 文件的新位置,就是在自己创建的临时目录upload下面的一个文件名,也就是我要上传文件所需要移动的新位置

move_uploaded_file() 函数将上传的文件移动到新位置/临时目录

5.文件上传成功或者不成功,以及不成功的原因进行判断

6.对上传错误进行处理_FILES['upload']['error']再使用switch()进行判断

7.将创建的临时文件删除,当然系统也会在结束会话时自动清空,通过检查文件目录,文件名是否正常再使用unlink()将其删除

对于目录遍历:这个可以掌握,难点就是文件上传吧,文件上传仅仅是个人理解,有可能有不到位的地方


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议