$_FILES为空通常因表单缺少enctype="multipart/form-data"、method非POST、php.ini中file_uploads=Off或upload_max_filesize/post_max_size过小、字段名与$_FILES键名不一致所致。

PHP 中 $_FILES 为什么总是空?
上传文件后 $_FILES 为空,大概率不是代码逻辑问题,而是表单或服务器配置没对上。
- 表单必须带
enctype="multipart/form-data",漏了这个属性,浏览器根本不会发送文件数据 -
method必须是POST,GET不支持文件上传 - 检查
php.ini:确认file_uploads = On,且upload_max_filesize和post_max_size足够大(比如都设为20M) - 上传字段名要和
$_FILES键名一致,比如表单用<input name="avatar">,就得查$_FILES['avatar'],而不是$_FILES['file']
Node.js 用 express 接收文件时,为什么 req.file 是 undefined?
Express 默认不解析 multipart/form-data,必须显式加中间件,而且顺序不能错。
- 必须用
multer(或其他兼容中间件),body-parser对文件无效 - 中间件注册要在路由之前,否则请求到路由时文件数据还没被解析
- 如果用
multer().single('photo'),表单字段名必须是photo;名字不匹配就拿不到req.file - 注意
req.files(复数)只在使用.array()或.fields()时存在,.single()只设req.file
Python Flask 的 request.files.get() 返回 None 怎么办?
和 PHP、Node 类似,核心还是表单 + 请求头 + 后端解析三者对齐。
- 确认 HTML 表单有
enctype="multipart/form-data"和method="POST" - Flask 不需要额外中间件,但必须从
request.files取,不能从request.form或request.json - 字段名区分大小写,
request.files.get('Upload')和request.files.get('upload')是两个东西 - 如果前端用了
fetch,记得手动构造FormData,不要直接JSON.stringify发送——那样发出去的不是 multipart
上传后怎么安全保存文件?别直接用原始文件名
原始文件名可能含路径遍历(如 ../../etc/passwd)、空格、中文、特殊字符,还可能被恶意覆盖已有文件。
- 永远不要拼接
os.path.join(upload_dir, filename),先用os.path.basename()提取纯文件名 - 生成唯一文件名,比如用
uuid.uuid4()或hashlib.sha256(时间+随机数).hexdigest()[:12] - 校验
content-type和实际文件头(magic bytes),仅靠扩展名或 MIME 类型容易被绕过 - 限制上传目录权限,避免 Web 服务能执行上传的文件(尤其 PHP/Python/JS 文件)
Content-Type —— 那个字段一加,浏览器就转成 JSON 发,文件直接消失。

















