PHP基础语法之文件上传

在PHP中上传文件是非常简单的,不像JAVA中的那样各种接口与对象,一个函数搞定一切。

文件上传表单

<?php
/* 文件上传 */
header("Content-Type: text/html; charset=utf-8");
?>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <h2>单个文件上传</h2>
    <form method="post" action="file/upload.php" enctype="multipart/form-data">
        <!--enctype="multipart/form-data" 这个属性必须添加才能识别是上传的文件否则就无法成功上传-->
        <p>选择文件:<input name="file" value="" type="file" /></p>
        <p>自定义保存文件名:<input type="checkbox" name="rename" value="ok" /></p>
        <p>文件名:<input name="name" value="" type="text" /></p>
        <input type="hidden" value="yes" name="one">
        <p><button type="submit">文件上传</button></p>
    </form>
<hr /><!--华丽的分割线-->
    <h2>多文件上传</h2>
    <form method="post" action="file/upload.php" enctype="multipart/form-data">
        <p>选择文件1:<input name="file[]" value="" type="file" /></p>
        <p>选择文件2:<input name="file[]" value="" type="file" /></p>
        <p>选择文件3:<input name="file[]" value="" type="file" /></p>
        <p>选择文件4:<input name="file[]" value="" type="file" /></p>
        <input type="hidden" value="no" name="one">
        <p><button type="submit">文件上传</button></p>
    </form>
</body>
</html>

文件上传处理file:file/upload.php

<?php
/* 文件上传处理请求 */
header("Content-Type: text/plain; charset=utf-8");

echo "打印\$_POST数组:\n";
print_r($_POST);

echo "\n打印\$_FILES数组:\n";
print_r($_FILES);//上传的文件信息会保存在这个数组中

//在继续之前建议先进行提交测试,查看这两个数组的内容
//在测试的时候可以观察单文件上传和多文件上传数组有什么不同,注意观察error的值
echo "\n\n";

$upload_dir = "write";
if(is_dir($upload_dir) == false && is_writable($upload_dir))die("上传文件目录错误");//is_writable表示判断文件夹是否可写

if($_SERVER['REQUEST_METHOD']=="POST"){
    if($_POST['one']=="yes"){
        echo "开始单文件上传处理\n";
        if(isset($_FILES["file"])){
            //此时表示我们有上传文件过来
            echo "检测到\$_FILES["file"]数组\n";
            if($_FILES["file"]['error'] == 0){
                //检测文件上传是否存在错误,0表示没有错误,其他数值错误含义查看手册
                echo "上传的文件没有错误\n";
                if(isset($_POST['rename']) && !empty($_POST['name']) && !file_exists($upload_dir."/".$_POST['name'])){
                    //先检测是否进行文件重命名,之后进行重命名的文件或目录是否存在
                    echo "使用自定义文件名移动";
                    if(move_uploaded_file($_FILES["file"]["tmp_name"],$upload_dir."/".$_POST['name']) === true)
                        echo "文件移动成功移动到 ".$upload_dir."/".$_POST['name'];
                    else
                        echo "自定义文件移动失败";
                }else{
                    if(file_exists($upload_dir."/".$_FILES["file"]['name'])){
                        echo "上传的目标文件".$_FILES["file"]['name']."在目录".$upload_dir."中已经存在";
                    }else{
                        echo "使用默认文件名移动";
                        if(move_uploaded_file($_FILES["file"]["tmp_name"],$upload_dir."/".$_FILES["file"]['name']) === true)
                            echo "文件移动成功移动到 ".$upload_dir."/".$_FILES["file"]['name'];
                        else
                            echo "默认方法文件移动失败";
                    }
                }
            }
        }
    }else{
        //继续之前可以先测试单文件上传
        echo "开始多文件上传\n";
        if(isset($_FILES["file"])){
            $i = 0;
            echo "开始进行错误检测\n";
            foreach($_FILES["file"]['error'] as $v){
                //开始进行错误检测
                if($v==0)echo "第".++$i."个文件上传正确\n";
                else
                    echo "第".++$i."个文件上传错误......XXXXXXX\n";
            }
            for($j = 0; $j < $i; $j++){
                move_file($j,$upload_dir);//调用一个多文件上传函数
            }
        }

    }
}else{
    die("只有在POST请求下有效");
}
//多文件上传处理函数,使用默认名称移动
function move_file($i,$dir){
    if($_FILES["file"]['error'][$i]==0){
        echo "\n开始移动第".($i+1)."个文件\n";
        $name = $_FILES["file"]['name'][$i];
        if(file_exists($dir."/".$name)){
            echo "默认目标文件已存在\n";
        }else{
            if(move_uploaded_file($_FILES["file"]['tmp_name'][$i],$dir."/".$name)){
                echo "成功上传文件到:".$dir."/".$name."\n";
            }else{
                echo "文件".$name."上传失败\n";
            }
        }
    }
}
?>

8条评论在“PHP基础语法之文件上传”

写下你最简单的想法