php上传音频文件前必须检查三件事:一是校验真实mime类型(用finfo_open而非$_files['type']),二是调大php.ini中upload_max_filesize和post_max_size(如设为20m),三是确保目标目录存在且web服务器用户有写权限(如chmod 775)。

PHP上传音频文件前必须检查的三件事
不校验文件类型、不设置上传限制、不验证目录权限,上传必然失败。PHP默认只允许2MB以内文件,且upload_max_filesize和post_max_size需同时调大,否则$_FILES可能为空。
- 确认
php.ini中file_uploads = On,并调整upload_max_filesize = 20M和post_max_size = 20M(音频常超2MB) - 目标目录(如
./uploads/audio/)必须存在且Web服务器用户(如www-data或nginx)有写权限,用chmod 755 uploads/audio不够,通常要775或777(开发环境可接受) - 表单必须设
enctype="multipart/form-data",否则$_FILES永远为空
用move_uploaded_file()安全移动音频文件
别用copy()或直接rename()——它们不校验是否为合法上传文件,易被绕过导致任意文件写入。PHP官方只认可move_uploaded_file()作为上传后唯一安全的移动方式。
- 先检查
$_FILES['audio']['error'] === UPLOAD_ERR_OK,非0值代表上传失败(如UPLOAD_ERR_INI_SIZE说明超upload_max_filesize) - 用
pathinfo($_FILES['audio']['name'], PATHINFO_EXTENSION)取扩展名,再白名单校验:in_array(strtolower($ext), ['mp3', 'wav', 'ogg', 'm4a']) - 生成唯一文件名避免覆盖,例如
$new_name = uniqid('audio_') . '.' . $ext,再拼完整路径:$target = './uploads/audio/' . $new_name - 执行
move_uploaded_file($_FILES['audio']['tmp_name'], $target),成功返回true,失败返回false且$target目录不会被创建
为什么getimagesize()不能用于音频校验
它只识别图片格式,对MP3/WAV等返回false或警告,误判率高。音频应优先用finfo_open()做MIME检测,更可靠。
-
$finfo = finfo_open(FILEINFO_MIME_TYPE),然后$mime = finfo_file($finfo, $_FILES['audio']['tmp_name']) - 检查
$mime是否在白名单中:in_array($mime, ['audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/mp4']) - 注意:
finfo扩展默认开启,但某些精简版PHP可能关闭,可用extension_loaded('fileinfo')判断 - 不要只信
$_FILES['audio']['type'],浏览器可伪造,完全不可靠
上传后立即播放需注意的HTTP头与路径
上传成功后若用<audio src="uploads/audio/xxx.mp3"></audio>无法播放,大概率是路径没映射到Web可访问目录,或缺少正确Content-Type响应头。
- 确保
uploads/audio/在Web根目录下(如Nginx的root /var/www/html),否则浏览器无法GET到该文件 - 如果音频存放在Web根外(如
/data/audio/),必须用PHP脚本代理输出,并显式设置header('Content-Type: audio/mpeg')和readfile($full_path) - 上传后的文件权限可能为600(仅属主可读),导致Web服务器无法读取,建议
chmod($target, 0644)补全 - Apache需启用
mod_mime,Nginx需在配置中显式添加types { audio/mpeg mp3; },否则可能返回text/plain
finfo扩展状态和Web服务器对音频MIME类型的默认支持——这两点不确认,前端就永远显示“无法加载资源”。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











