PHP中调用display_indivsong()时filesize()抛出stat警告求助
问题排查与解决方法
问题原因
- 使用
file()函数读取播放列表(txt文件)时,返回的每一行字符串会包含末尾的换行符(\n或\r\n)。当把这个字符串直接拼接到路径songs/$file时,实际的文件路径会变成类似songs/xxx.mp3\n,这个路径对应的文件不存在,因此filesize()会抛出"文件不存在"的错误。 - 而
displaysong()方法中通过glob('songs/*.mp3')获取的文件名是纯净的,没有多余的换行符,所以能正常调用filesize()。
解决方法
1. 清理播放列表的文件名
在传递文件名给display_indivsong()之前,用trim()函数去掉字符串首尾的空白字符(包括换行、空格等),修改播放列表处理的循环代码:
foreach($content as $indiv_song){ // 清理文件名中的换行符和空白字符 $clean_song = trim($indiv_song); $song->display_indivsong($clean_song); }
2. 修复file_size()方法的逻辑漏洞
原方法先调用filesize()再判断文件是否存在,若文件不存在会直接报错。调整为先判断文件存在性,再获取大小:
function file_size($filename){ // 先校验文件是否存在 if(!file_exists($filename)){ return " (无效文件)"; } $size = filesize($filename); if( $size>1023 && $size<1048575){ $size = $size/1024; $size = " (". $size." kb)"; } else if($size>1048575){ $size = $size/1048576; $size = " (". round($size, 2) ." mb)"; } else{ $size = " (". $size." b)"; } return $size; }
3. (可选)给display_indivsong()增加容错处理
避免空文件名或无效路径导致的异常:
function display_indivsong($file){ $clean_file = trim($file); if(empty($clean_file)) return; $path = "songs/$clean_file"; ?> <li class="mp3item"> <a href="<?php echo $path?>"> <?php echo $clean_file; echo $this->file_size($path);?></a> </li> <?php }
内容的提问来源于stack exchange,提问作者kim2002
相关产品推荐
相关产品推荐

