要把文件安全地上传到服务器,咱们得自己动手写上传的逻辑,不能直接拿现成的,因为在Web开发里,文件上传是特别容易被黑客攻击的地方。要是不仔细检查,随便让人上传文件,服务器很容易变成别人用来搞破坏或者钓鱼的工具。下面我就把从前端到服务器这个完整的过程拆开来讲,一步步教你怎么写出既好用又安全的上传功能。 第一步得先写个HTML表单,让它能传文件。标签里的enctype必须设成multipart/form-data,这是个二进制文件上传的“通行证”,少了这个浏览器就不会把文件内容放到请求里,服务器也就收不到东西。标签的type属性得写成file,这样输入框旁边才会有个“浏览”按钮,用户点一下就能选本地文件。没有这个属性,表单再好看也没用。 允许用户上传文件其实是给服务器开了个后门,所以得限制上传接口只给可信的用户用。而且到了后端还得再检查一遍文件类型和大小,千万别心软。 客户端发来的文件被PHP自动拆开了放到$_FILES数组里,这就好比一份快递清单。这里面有原文件名、MIME类型、文件大小(字节)、服务器临时存放的路径和上传过程的错误代码。拿到清单后别急着动文件,先看看错误码有没有问题,要是权限不够或者磁盘满了、文件太大,后面每一步都可能失败。 接下来给上传加把锁,限制只能传.gif或者.jpeg格式的文件,大小不能超过20 KB。这段代码就是这样写的:判断文件的MIME类型是不是image/gif、image/jpeg或者image/pjpeg(因为IE和Firefox对JPEG的识别不一样,IE用pjpeg,Firefox用jpeg),还要看大小有没有超过20000字节,同时错误码得是0才行。注意IE和Firefox对JPEG的识别差异:IE用"pjpeg",Firefox用"jpeg"。 最后把临时文件挪到自己的家才算完成安全落地。先看看目标目录存不存在也能不能写进去,可以用is_dir()和is_writable()两个函数双保险一下。然后用move_uploaded_file这个函数把临时文件移动到指定的位置,它会返回一个布尔值表示成功与否。如果成功了就提示上传成功的消息;如果失败了就要输出错误日志方便排查问题。 如果需要的话可以把临时文件清空一下,用@unlink这个命令能屏蔽掉删除时的警告信息。其实脚本执行完临时文件会自己消失的,显式删除能减少磁盘碎片和潜在风险。要是目标目录不可写就直接跳过删除步骤好了。 总结一下安全上传的“四把锁”:前端用enctype告诉浏览器要发文件;后端拿到$_FILES后先查错误码;接着用类型、大小和错误码这三重校验把风险锁死;最后用move_uploaded_file确认文件落地并清理临时副本。把这四步做成标准化接口以后不管业务怎么变只要调这个接口就能安心收文件啦。