PHP实现文件上传

2023-04-24 11:42:32 浏览数 (2)

PHP文件上传功能由俩个部分组成,HTML页面和PHP处理部分,HTML页面主要让用户选中要上传的文件,PHP部分让我们可以把文件存储到服务器的指定目录。

HTML部分

代码语言:javascript复制
  <form method="post" action="upload_file.php" enctype="multipart/form-data">
    <label for="file">文件:</label>
    <input type="file" name="file" id="file" />
    <br />
    <input type="submit" name="submit" value="上传" />
  </form>

在上传文件的表单中,表单必须设置 enctype="multipart/form-data"来告诉服务器上传的文件中带有常规表单信息。

<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个选择文件按钮。

PHP部分

代码语言:javascript复制
<!-- 上传脚本 -->
<?php
// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["file"]["name"]);  //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);
// 文件类型判断 文件大小判断 后缀名匹配判断
if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
  && ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
  && in_array($extension, $allowedExts)
) {
  if ($_FILES["file"]["error"] > 0) {
    echo "错误:: " . $_FILES["file"]["error"] . "<br>";
  } else {
    echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
    // 判断当前目录下是否存在该文件
    if (file_exists("upload/" . $_FILES["file"]["name"])) {
      echo $_FILES["file"]["name"] . " 文件已经存在。 ";
    } else { // 如果没有该目录,创建目录
      move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
      echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
    }
  }
} else {
  echo "非法的文件格式";
}

重命名文件

随机字符串

预置一个的字符串$chars ,包括 a–z,A–Z,0–9,以及一些特殊字符,生成固定长度的随机字符串。

代码语言:javascript复制
function random($length) {
    $file_name = 'CR-';
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
    $max = strlen($chars) - 1;
    mt_srand((double)microtime() * 1000000);
    for($i = 0; $i < $length; $i  ) {
        //取字符数组 $chars 的任意元素
        $file_name .= $chars[mt_rand(0, $max)];
        //使用 substr 截取$chars中的任意一位字符
        //$file_name .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
    }
    return $file_name;
}

此时的PHP代码如下:

代码语言:javascript复制
<!-- 上传脚本 -->
<?php
// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["file"]["name"]);  //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);
// 文件类型判断 文件大小判断 后缀名匹配判断
if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
  && ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
  && in_array($extension, $allowedExts)
) {
  if ($_FILES["file"]["error"] > 0) {
    echo "错误:: " . $_FILES["file"]["error"] . "<br>";
  } else {
    echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
    // 判断当前目录下是否存在该文件
    if (file_exists("upload/" . $_FILES["file"]["name"])) {
      echo $_FILES["file"]["name"] . " 文件已经存在。 ";
    } else {
      // 调用随机字符串生成随机文件名
      $new_filename = random(10) . '.';
      // 在移动上传文件时,直接使用move_uploaded_file()函数更改文件名。
      move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $new_filename . $extension);
      echo "文件存储在: " . "upload/"  . $new_filename . $extension;
    }
  }
} else {
  echo "非法的文件格式";
}

// 随机字符串命名函数
function random($length)
{
  $file_name = 'CR-';
  $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
  $max = strlen($chars) - 1;
  mt_srand((float)microtime() * 1000000);
  for ($i = 0; $i < $length; $i  ) {
    //取字符数组 $chars 的任意元素
    $file_name .= $chars[mt_rand(0, $max)];
    //使用 substr 截取$chars中的任意一位字符
    //$file_name .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
  }
  return $file_name;
}

时间戳命名

php本身没有提供返回毫秒数的函数,但提供了microtime()方法,它会返回一个数组,包含两个元素:一个是秒数、一个是小数表示的毫秒数,我们可以通过如下方法获取返回的毫秒数:

代码语言:javascript复制
 function getMillisecond() {
        list($t1, $t2) = explode(' ', microtime());
        return (float)sprintf('%.0f', (floatval($t1)   floatval($t2)) * 1000);
    }
    echo getMillisecond();

完整代码如下:

代码语言:javascript复制
<!-- 上传脚本 -->
<?php
// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["file"]["name"]);  //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);
// 文件类型判断 文件大小判断 后缀名匹配判断
if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
  && ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
  && in_array($extension, $allowedExts)
) {
  if ($_FILES["file"]["error"] > 0) {
    echo "错误:: " . $_FILES["file"]["error"] . "<br>";
  } else {
    echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
    // 判断当前目录下是否存在该文件
    if (file_exists("upload/" . $_FILES["file"]["name"])) {
      echo $_FILES["file"]["name"] . " 文件已经存在。 ";
    } else {
      // 调用时间戳生成随机文件名
      $new_filename = getMillisecond() . '.';
      // 在移动上传文件时,直接使用move_uploaded_file()函数更改文件名。
      move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $new_filename . $extension);
      echo "文件存储在: " . "upload/"  . $new_filename . $extension;
    }
  }
} else {
  echo "非法的文件格式";
}

// 获取时间戳
function getMillisecond()
{
  list($t1, $t2) = explode(' ', microtime());
  return (float)sprintf('%.0f', (floatval($t1)   floatval($t2)) * 1000);
}

保存文件路径到数据库

首先,给form表单添加 enctype="multipart/form-data" 并给上传文件的input标签添加name

代码语言:javascript复制
 <input type="file" class="form-control" name="img_file">

然后在PHP处理文件中进行处理

代码语言:javascript复制
// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["img_file"]["name"]);  //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);
// 文件类型判断 文件大小判断 后缀名匹配判断
if ((($_FILES["img_file"]["type"] == "image/gif")
        || ($_FILES["img_file"]["type"] == "image/jpeg")
        || ($_FILES["img_file"]["type"] == "image/jpg")
        || ($_FILES["img_file"]["type"] == "image/pjpeg")
        || ($_FILES["img_file"]["type"] == "image/x-png")
        || ($_FILES["img_file"]["type"] == "image/png"))
    && ($_FILES["img_file"]["size"] < 204800)   // 小于 200 kb
    && in_array($extension, $allowedExts)
) {
    if ($_FILES["img_file"]["error"] > 0) {
        echo "错误:: " . $_FILES["img_file"]["error"] . "<br>";
    } else {
        if (file_exists("../upload/" . $_FILES["img_file"]["name"])) {
            $icon_file = $_FILES["img_file"]["name"];
        } else {
            // 调用时间戳生成随机文件名
            $new_filename = getMillisecond() . '.';
            // 在移动上传文件时,直接使用move_uploaded_file()函数更改文件名。
            move_uploaded_file($_FILES["img_file"]["tmp_name"], "../upload/" . $new_filename . $extension);
            // 获取到文件的路径并赋值给$img_file
            $img_file = "../upload/"  . $new_filename . $extension;
        }
    }
} else {
    echo "非法的文件格式";
}

// 获取时间戳
function getMillisecond()
{
    list($t1, $t2) = explode(' ', microtime());
    return (float)sprintf('%.0f', (floatval($t1)   floatval($t2)) * 1000);
}

此时得到的文件路径为变量:$img_file

然后在数据库语句中引用即可。

0 人点赞