文件上传

PHP 中使用 $_FILES 接收表单上传的文件。

<html>
<body>
  <form method="post"
    action="upload_file.php"
    enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="Submit">
  </form>
</body>
</html>

$_FILES 第一个参数是表单的 input name,第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:

  • $_FILES["file"]["name"] - 被上传文件的名称
  • $_FILES["file"]["type"] - 被上传文件的类型
  • $_FILES["file"]["size"] - 被上传文件的大小,以字节计
  • $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
  • $_FILES["file"]["error"] - 由文件上传导致的错误代码
// upload_file.php
if ($_FILES["file"]["error"] > 0) {
  echo "Error: " . $_FILES["file"]["error"] . "<br>";
} else {
  echo "Upload: " . $_FILES["file"]["name"] . "<br>";
  echo "Type: " . $_FILES["file"]["type"] . "<br>";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
}

在表单 input[type='file'] 中指定 name 属性,在 php 中使用 $_FILES["file"] 接收,其中 "file" 是指定的表单 name 属性。

上传限制

在脚本中对文件上传的限制。比如,用户只能上传 .png、.gif 和 .jpeg 文件,文件大小必须小于 20 kB:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (
  (
    ($_FILES["file"]["type"] == "image/gif") ||
    ($_FILES["file"]["type"] == "image/jpeg") ||
    ($_FILES["file"]["type"] == "image/png")
  ) && ($_FILES["file"]["size"] < 204800) && // 小于 200 kb
  in_array($extension, $allowedExts)
) {
  if ($_FILES["file"]["error"] > 0) {
    echo "Error: " . $_FILES["file"]["error"] . "<br>";
  } else {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Stored in: " . $_FILES["file"]["tmp_name"];
 }
} else {
  echo "Invalid file";
}

指定上传目录

上面的例子会在系统临时文件夹创建了一个被上传文件的临时副本。

这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置,如果不指定上传目录,默认上传到系统临时目录下,并且命名以 .tmp 结束:

<html>
<body>
  <form method="post" enctype="multipart/form-data"
    action="upload_file.php"
  >
    <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
    File: <input type="file" name="upfile" /><br>
    <input type="submit" name="sub" value="submit" />
  </form>
</body>
</html>
header('Content-Type: text/plain; charset=utf-8');
if ( isset($_POST['sub']) ) { // isset() 函数判断提交按钮值是否存在
  if( !is_dir("images") ) { // is_dir() 函数判断指定的文件夹是否存在
    mkdir("images"); // mkdir() 函数创建文件夹
  }
  $file = $_FILES['upfile']; // 获取上传文件
  if(is_uploaded_file($file['tmp_name'])){
    // stristr()函数获取上传文件的后缀
    $ext = stristr($file['name'], '.');
    // 定义上传文件的存储位置,strtotime() 函数定义一个Unix时间戳
    $path = "images/".strtotime("now").$ext;
    // 判断文件是否存在
    if (file_exists($path . $file['name']))
    {
      echo $_FILES["file"]["name"] . " already exists. ";
      exit;
    }
    // move_uploaded_file() 将临时文件移动到指定目录
    if(move_uploaded_file($file['tmp_name'], $path)) // 执行文件上传操作
    {
      echo "上传成功,文件名称为:".strtotime("now").$ext;
    }
  }
}

其中,move_uploaded_file 的语法如下

bool move_uploaded_file ( string $filename , string $destination )

参数:

  • filename - 上传的文件的文件名。
  • destination - 移动文件到这个位置。

返回值:

  • 成功时返回 TRUE。
  • 如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 FALSE。
  • 如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 FALSE。此外还会发出一条警告。

多文件上传

如果上传的是多个文件,可以遍历上传的文件列表,然后存到指定目录:

$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
  if ($error == UPLOAD_ERR_OK) {
    $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
    $name = $_FILES["pictures"]["name"][$key];
    move_uploaded_file($tmp_name, "$uploads_dir/$name");
  }
}

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress