PHP基础教程(107)PHP获取表单数据之获取文件域的值:让PHP接住你抛来的文件:从“翻车”到“秋名山车神”的上传实战

第1章:当表单遇上文件——那个被遗忘的enctype“开关”

刚学PHP处理表单时,你是不是觉得$_POST$_GET像哆啦A梦的口袋?直到遇见了文件上传——明明代码抄得一字不差,$_FILES却总是空荡荡的,浏览器还一副“不关我事”的表情。这时候八成是踩中了第一个坑:忘记给表单加enctype="multipart/form-data"

这属性就像快递柜的投递口开关。没打开时,你往<input type="file">里塞再多文件,数据根本送不出去。我当年就干过这种事:熬夜写了50行上传代码,结果文件死活传不上,最后发现表单标签写得比脸还干净:

<form method="post">
  <!-- 少了关键一句:enctype="multipart/form-data" -->
  <input type="file" name="myfile">
</form>

正确姿势应该是:

<form method="post" enctype="multipart/form-data" action="upload.php">

enctype默认是application/x-www-form-urlencoded,这种格式打包文件就像把披萨压扁了塞进信封——到服务器只剩一滩番茄酱。而multipart/form-data会把文件切成数据块,像乐高一样拼装运输。

第2章:拆解$_FILES——比俄罗斯套娃还复杂的数据结构

当表单设置正确后,PHP会把上传的文件信息塞进超全局变量$_FILES里。这玩意儿结构长得像俄罗斯套娃:

<?php
print_r($_FILES);
/* 输出示例:
Array
(
    [userfile] => Array  # 表单里input的name值
    (
        [name] => "猫主子表情包.jpg"     # 原始文件名
        [type] => "image/jpeg"          # MIME类型
        [tmp_name] => "/tmp/php3h8sjf"  # 临时存放路径(重点!)
        [error] => 0                    # 错误码(0表示成功)
        [size] => 204800                # 文件大小(字节)
    )
)
*/

这里有个天大的误会:很多人以为文件上传后就躺在服务器某个文件夹里等你用。其实tmp_name指向的只是临时中转站,脚本执行结束就会被系统自动清空!就像外卖小哥把披萨放物业前台,你不及时取走,保洁阿姨下班就给扔了。

第3章:文件搬家大法——move_uploaded_file()的骚操作

要让文件永久安家,必须用move_uploaded_file()函数搬家。它的工作原理堪比物流转运:

$tmpPath = $_FILES['userfile']['tmp_name'];  // 临时仓库
$newPath = "uploads/" . $_FILES['userfile']['name']; // 永久仓库

if (move_uploaded_file($tmpPath, $newPath)) {
    echo "文件已安全入库!";
} else {
    echo "搬家中途翻车了...";
}

但直接这么写会触发三大经典翻车现场

  1. 目标文件夹没权限
    Linux服务器常见错误。解决方法:
chmod 755 uploads  # 给文件夹开权限
chown www-data uploads  # 让PHP进程有所有权
  1. 文件名重复导致覆盖
    用户A上传“简历.pdf”,用户B也传同名文件,前者就被覆盖了。解决方案是生成唯一ID:
$extension = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);
$newName = uniqid() . '_' . date('Ymd') . '.' . $extension;
// 生成:60f8a9b1_20231205.jpg
  1. 路径分隔符跨系统问题
    Windows用反斜杠\,Linux用正斜杠/。用DIRECTORY_SEPARATOR常量最保险:
$newPath = 'uploads' . DIRECTO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值