个人随笔
技术改变世界

PHP 文件上传

php

本文目标编写处理文件的PHP代码。

当文件被上传时,该文件将保存在临时目录中,这是通过php.ini文件的upload_tmp_dir指令设置的。如果没有设置该指令,在默认情况下,该目录是Web服务器上的主目录。如果在脚本执行完毕之前不移动、复制或更改文件名称,该文件将被删除。

在PHP脚本中,需要处理的数据保存在超级全局数组$_FILES中。如果开启了register_globals指令,也可以直接通过变量名称访问这些信息。但是,这可能就是关闭register_globals指令的原因,或者至少认为是关闭了该指令,并且使用超级全局数组而忽略全局变量。

保存$_FILES数组中的元素时,将同时保存HTML表单的标记名称。表单元素名称是userfile,因此该数组将具有如下所示的内容:

  • 存储在$_FILES[‘userfile’][‘tmp_name’]变量中的值就是文件在Web服务器中临时存储的位置。
  • 存储在$_FILES[‘userfile’][‘size’]变量中的值就是文件的字节大小。
  • 存储在$_FILES[‘userfile’][‘type’]变量中的值就是文件的MIME类型,例如:text/plain或image/gif。
  • 存储在$_FILES[‘userfile’][‘error’]变量中的值将是任何与文件上传相关的错误代码。这是在PHP 4.2.0 中增加的新特性。

如果已经知道上传文件的位置及名称,现在,就可以将其复制到其他有用的地方。在脚本执行结束前,这个临时文件将被删除。因此,如果保留上传文件,必须将其重命名或移动。

在这个示例中,我们打算上传文件作为最新的新闻文章,因此,我们删除文件中可能的任何标记,再将它们移动到其他有用的目录,/uploads/ 目录。请注意,在Web服务器的根目录下,你需要创建一个名为 uploads 的目录。以下代码实现了该功能:

upload.html 文件代码:

<html>
<head>
    <title>PHP文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<form action="upload.php" method="post" enctype="multipart/form-data" />
    <div>
        <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
        <label for="userfile">上传一个文件:</label>
        <input type="file" name="userfile" id="userfile" />
        <input type="submit" value="上传文件" />
    </div>
</form>
</body>
</html>

upload.php 文件代码:

<hmtl>
<head>
    <title>文件上传中...</title>
</head>
<body>
<h1>文件上传中...</h1>
<?php
    if($_FILES['userfile']['error'] > 0){
        echo "Problem:";
        switch ($_FILES['userfile']['error']) {
            case 1:
                echo "文件超出 upload_max_filesize 限制";
                break;
            case 2:
                echo "文件超出 max_file_size 限制";
            case 3:
                echo "文件只有部分被上传";
                break;
            case 4:
                echo "上传没有文件";
                break;
            case 6:
                echo "不能上传文件:没有指定的临时目录";
                break;
            case 7:
                echo "上传失败:无法写入到磁盘";
                break;
            default:
                # code...
                break;
        }
        exit;
    }

    // 是否该文件有正确的MIME类型?
    if($_FILES['userfile']['type'] != 'text/plain'){
        echo '问题:文件不是纯文本';
        exit;
    }

    // 放到哪里,我们希望它的文件
    $upfile = './uploads/'.$_FILES['userfile']['name'];

    if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
        if(!move_uploaded_file($_FILES['userfile']['tmp_name'], $upfile)){
            echo '问题:无法移动文件到目标目录';
            exit;
        }
    }else{
        echo '问题:可能的文件上传攻击。名称:';
        echo $_FILES['userfile']['tmp_name'];
        exit;
    }

    echo "文件上传成功<br/ ><br />";

    // 消除可能的HTML和PHP标签从该文件的内容
    $contents = file_get_contents($upfile);
    $contents = strip_tags($contents);
    file_put_contents($_FILES['userfile']['name'], $contents);

    // 显示上传的内容
    echo "<p>预览上传的文件内容:<br /><br />";
    echo nl2br($contents);
    echo "<br /><br />";
?>
</body>
</hmtl>

转载请注明出处王旭博客 » PHP 文件上传

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址