无论是社区网站还是电商网站都离不开上传文件的功能,这里就用PHP实现简单单文件上传,后续还会写更复杂的 AJAX 和多文件上传。

代码

HTML表单:

<form action="server1.php" method="post" enctype="multipart/form-data">
    <input type="file" name="img">
    <input type="submit" value="上传文件">
</form>

默认的文件选择按钮会比较丑,如果想美化文件选择按钮可以把文件选择按钮隐藏,定义一个普通按钮,通过普通按钮来调用文件选择按钮的点击事件。

PHP代码:

<?php

$file = $_FILES['img'];  //  把文件传给一个变量

//  判断是否有错误,error大于0说明有错误
if ($file['error'] > 0) {
    exit('文件上传出错!错误码' . $file['error']);  //  不在往下执行,输出错误码
}

if ($file['size'] > 1048576) {  //  判断文件大小是否超过1M
    exit('文件大小不能超过1M');  //  文件超过1M,不在往下执行
}

//  判断文件扩展名的方法有很多,这里就用正则表达式来判断扩展名
$re = "/\.jpg$|\.png$|\.gif$/";  //  用一个简单的正则表达式来判断扩展名
$extensionName = array();  //  用来接收扩展名的数组
preg_match($re, $file['name'], $extensionName);  //  如果匹配成功会返回扩展名
//  如果数组大于0说明匹配成功
if (count($extensionName) < 1) {
    exit('不支持的文件格式');  //  不在往下执行
}

//  把上传的文件移动到指定文件夹,成功返回true 失败返回false
if (move_uploaded_file($file['tmp_name'], 'files/' . $file['name'])) {
    echo '文件上传成功';
}else {
    echo '文件上传失败';
}

说明

$_FILES 全局数组可接收客户端上传的文件,第一个参数是表单的 input name,第二个下标可以是 name, type, size, tmp_nameerror,这里使用的表单的 input 名称就是 img

详细说明:

  • $_FILES['img']['name'] 被上传文件的名称
  • $_FILES['img']['size'] 被上传文件的大小,以字节计
  • $_FILES['img']['type'] 被上传文件的类型
  • $_FILES['img']['tmp_name'] 存储在服务器的文件的临时副本的名称
  • $_FILES['img']['error'] 由文件上传导致的错误代码

错误代码说明:

  • 0 没有错误
  • 1 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值
  • 2 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值
  • 3 文件只有部分被上传
  • 4 没有文件被上传。 是指表单的file域没有内容

move_uploaded_file() 函数可以把上传的文件移动到指定文件夹,参数1是文件位置,参数2是文件名,同时也包含文件路径,成功会返回true,失败会返回false。