PHP:如何处理包含#数字符号的文件名?

时间:2014-02-10 22:52:11

标签: php special-characters filenames file-handling

我正在开发一个小项目,为网络界面提供一些音频数据。 我正在用PHP阅读现有文件夹的内容。

这是我的PHP代码:

<?php
$mp3folder = 'mp3/';
$oggfolder = 'ogg/';
$mp3files = glob($mp3folder.'*.mp3');
$oggfiles = glob($oggfolder.'*.ogg');
echo '
<script type="text/javascript">
    $(document).ready(function(){
    new jPlayerPlaylist({
        jPlayer: "#jquery_jplayer_1",
        cssSelectorAncestor: "#jp_container_1"
    }, [';


for ($i=0; $i<count($mp3files); $i++) {
    $namerr[$i] = substr($oggfiles[$i],strlen($oggfolder),strpos($oggfiles[$i], '.')-strlen($oggfolder));
    echo '{'."\n";
    echo 'title:"'.$namerr[$i].'",'."\n";
    echo 'mp3:"'.$mp3files[$i].'",'."\n";
    echo 'ogg:"'.$oggfiles[$i].'"'."\n";
    echo '},'."\n";
}
echo '
    ], {
        swfPath: "../../_res/jplayer",
        supplied: "ogg, mp3",
        wmode: "window",
        smoothPlayBar: true,
        keyEnabled: true
    });
});
</script>';

?> 

我的目录结构如下:

AUDIO
 -> index.php
 -> OGG
   -> SONG#1.ogg
   -> SONG#n.ogg
   -> SONG FUN. ogg
 -> MP3
   -> SONG#1.mp3
   -> SONG#n.mp3
   -> SONG FUN.mp3

上面的php代码成功读取音频文件并构建一个列表,因此jPlayer可以读取它们并显示播放列表。
问题是:当文件名包含“#”符号时,jPlayer将无法读取音频文件。 当我尝试播放“SONG#1.mp3”然后查看Chromium中的调试器时,它显示“File SONG”未找到,而它通常会输出类似“File'SON FUN.mp3'成功读取”的内容。

所以我的结论是PHP在读取包含“#”的文件名时遇到了一些问题。

或者jPlayer可能会成为问题吗?

顺便说一句:这是我的第一个PHP项目,所以如果有很多错误请放纵。我确信有不同的,更好的方法来解决这个问题。但我是学习者。

问候!

2 个答案:

答案 0 :(得分:0)

jPlayer我是一个基于jquery的应用程序。它将您输出的文件名视为实际URL。在URL的情况下,hashtag表示不是文件名的一部分的本地ID。例如http://www.example.com/dir/file#id只返回“file”作为文件名,不包括#id!

所以你可以通过两种方式看待你的问题:

  1. 这是由jPlayer中的限制造成的,而jPlayer的定义又是由URL的定义限制引起的,或者
  2. 这是由于您在不允许使用#的地方造成的。
  3. 由于您无法更改URL的定义方式,因此您必须更改文件名,而不是包含主题标签。

答案 1 :(得分:0)

感谢所有帮助过我的人!特别感谢@Wrikken

我想我终于明白了: 当我使用urlencode()将URL转换为正确的形式时,我遇到的问题是空格转换为+符号,应该转换为%20。 这是 - 据我所知 - 主要是因为urlencode()用于查询,所以像index.php?search=Hello+World这样的事情。

解决方案是使用rawurlencode()代替。

因此,现在所讨论的部分代码如下所示:

for ($i=0; $i<count($mp3files); $i++) {
$namerr[$i] = substr($oggfiles[$i],strlen($oggfolder),strpos($oggfiles[$i], '.')-strlen($oggfolder));
echo '{'."\n";
echo 'title:"'.$namerr[$i].'",'."\n";
echo 'mp3:"'.dirname($mp3files[$i]).'/'.rawurlencode(basename($mp3files[$i])).'",'."\n";
echo 'ogg:"'.dirname($oggfiles[$i]).'/'.rawurlencode(basename($oggfiles[$i])).'",'."\n";
echo '},'."\n";
}

感谢所有好评!