第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 "搬家中途翻车了...";
}
但直接这么写会触发三大经典翻车现场:
- 目标文件夹没权限
Linux服务器常见错误。解决方法:
chmod 755 uploads # 给文件夹开权限
chown www-data uploads # 让PHP进程有所有权
- 文件名重复导致覆盖
用户A上传“简历.pdf”,用户B也传同名文件,前者就被覆盖了。解决方案是生成唯一ID:
$extension = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);
$newName = uniqid() . '_' . date('Ymd') . '.' . $extension;
// 生成:60f8a9b1_20231205.jpg
- 路径分隔符跨系统问题
Windows用反斜杠\,Linux用正斜杠/。用DIRECTORY_SEPARATOR常量最保险:
$newPath = 'uploads' . DIRECTO

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



