使用PHP实现图片上传

【实例描述】在网站中,文件上传是一个必备的组成部分。很多网站都要用到文件的上传,如用户上传自定义的头像、需求方上传需要翻译的原文等。本实例实现了单个图片文件上传和预览效果

【实现过程】(1)创建脚本文件index.php。在页面上添加表单结构和文件域,以供用户选择图片路径,表单的核心代码如下。

<form action="upload.php?submit=on" method="post" enctype="multipart/form-data"
    name="myForm">
            请选择上传的图片
            <input type="file" name="filename" id="filename" onChange="ok()">
            <center>
                  <font color="red">注意:请上传120*45像素的GIF或者jpg格式的logo图片
            </font>
            </center>
            <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
            <input type="submit" name="Submit" value="上传" class='input'>
        </form>

(2)创建脚本文件upload.php。添加PHP脚本文件如下。

<?php
        header('Content-type:text/html;charset=utf-8'); // 定义页面编码格式
        if(!empty($_GET['submit'])){
    
    
        // 表单非空验证
            $path="./upload/";                         // 文件上传路径
            if(!file_exists($path)){
    
                       // 检查是否有该文件路径
                  mkdir("$path", 0700);                  // 创建文件路径,并给予最高权限
            }
            $tp = array("image/gif","image/pjpeg","image/png"); // 允许上传的文件格式
            if(!in_array($_FILES["filename"]["type"],$tp)){
    
         // 检查文件上传类型
                  echo "格式不对";
                  exit();
            }
            if($_FILES["filename"]["size"]>(2048*1000)){
    
            // 检查文件上传大小
                  echo "不能上传大于2m的文件";
                  exit();
            }
            if($_FILES["filename"]["name"]){
    
               // 生成文件上传名称
                  $file1=explode('.',$_FILES["filename"]["name"]);
                  $kz = $file1[(count($file1)-1)];
                  $time = time();                        // 获取当前日期时间戳
                  $name = $time.".".$kz;                 // 生成上传文件名称
                  $file2 = $path.$name;
                  // 生成上传文件路径
                  $flag=1;
            }
            if($flag){
    
                                     // 把文件移动到指定的目录
    $result=move_uploaded_file($_FILES["filename"]["tmp_name"],$file2);
            }
            if($result){
    
                                   // 对图片进行预览
                  echo "<script>alert(\"上传成功!\");</script>";
                  echo "<center>图片名称:".$name."</center><br>";
                  echo "<center>logo预览:<br></center><center><img src='".$file2."'>
</center>";
            }
        } else{
    
                                             // 文件上传失败提示
            echo "<script>alert('文件为空!');location='index.php';</script>";
        }
        ?>
                             

【代码解析】本实例中,使用了$_FILES预定义变量和文件上传函数实现图片上传的效果。实现步骤如下。

(1)设置表单的enctype属性,使用POST提交和隐藏域。若进行文件上传,就需要给文件域控件所在的表单头添加enctype属性。enctype属性的值通常如下所示。

  • ❑ application/x-www-form-urlencoded:默认值,此类型主要用来处理少量文本数据的传递。在向服务器发送其他数据类型时,效率较低。
  • ❑ multipart/form-data:上传二进制数据。本例中使用类型值进行文件的上传。
  • ❑ text/plain:此方式主要用于发送大量的文本数据。
    实现文件上传效果必须使用POST提交模式,本实例设置隐藏域如下。
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />

隐藏域中name的值默认为MAX_FILE_SIZE,通过定义value里面的值(单位字节)来限定表单文件上传的最大值。
(2)使用 $_FILES 预定义变量获取文件上传信息。当用户以POST模式提交表单信息时,文件会被保存在临时目录中,文件的信息会被保存在$_FILES预定义变量中,用户可根据$_FILES变量中的信息进行文件上传操作。$_FILES预定义变量数组参数说明如表1所示。
表1 预定义变量$_FILES数组参数说明
在这里插入图片描述
(3)使用move_uploaded_file()函数把临时图片文件移动到指定目录下。文件上传后,文件会被临时保存在服务器的临时目录下,可以使用此函数把文件从临时目录下移动到用户自定义的位置,语法如下。

bool move_uploaded_file ( string filename, string destination)

此函数和文件拷贝函数不同的是,其除了对文件进行复制和移动外,还可以检查并确保由filename指定的文件是合法上传文件(即通过HTTP POST机制所上传的文件)。如果文件合法,则将其移动为由destination指定的文件。如果filename不是合法的上传文件,不会出现任何操作,move_uploaded_file()将返回假。如果filename是合法的上传文件,但出于某些原因无法移动,也不会出现任何操作,move_uploaded_file()同样将返回假,此外还会发出一条警告。这种检查对安全性显得格外重要。所以,通常都会使用此函数进行文件移动。

if($flag){
    
                                              // 把文件移动到指定的目录
            $result=move_uploaded_file($_FILES["filename"]["tmp_name"],$file2);
        }

(4)以上3个步骤为文件上传的核心,本实例还提供了文件类型检测和文件大小检测。类型检测有助于构建更加安全的程序运行环境,防止用户或程序的恶意提交。文件类型检测如下。

if(!in_array($_FILES["filename"]["type"],$tp)){
    
             // 检查文件上传类型
        ……此处省略部分代码

文件大小检测如下。

if($_FILES["filename"]["size"]>(2048*1000)){
    
                // 检查文件上传大小
            echo "不能上传大于2MB的文件";
            exit();
        }

猜你喜欢

转载自blog.csdn.net/singdo123/article/details/109210513