前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP实现文件上传

PHP实现文件上传

作者头像
岳泽以
发布2023-04-24 11:42:32
2.9K0
发布2023-04-24 11:42:32
举报
文章被收录于专栏:岳泽以博客岳泽以博客

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023 年 04 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HTML部分
  • PHP部分
  • 重命名文件
    • 随机字符串
      • 时间戳命名
      • 保存文件路径到数据库
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档