PHP FTP远程服务器文件下载页面问题及显示优化求助
解决你的MP3下载页面问题:链接失效与多余条目
让我们一步步搞定你遇到的两个问题:下载链接提示“URL未找到”,以及页面显示多余的点。
1. 下载链接失效的问题
原因分析
你用ftp_nlist获取的$mp3_url是服务器文件系统的绝对路径(比如/public_html/wp/wp-content/plugins/AbonneerProgrammas/Albums/xxx.mp3),但浏览器需要的是可通过HTTP访问的公开URL,而不是服务器内部的文件路径。直接把这个路径作为链接地址,浏览器自然找不到资源。
解决方案
你需要把服务器文件路径转换成网站的HTTP可访问URL。假设你的WordPress站点域名是https://your-domain.com,那么Albums目录的公开URL应该是https://your-domain.com/wp-content/plugins/AbonneerProgrammas/Albums/。
最简单的方式是提取文件名后拼接公开URL前缀,这样就能生成浏览器可识别的下载地址。
2. 页面显示多余点的问题
原因分析
ftp_nlist默认会返回当前目录(.)和上级目录(..)这两个特殊条目,你的代码没有过滤它们,循环时就会把这两个也渲染出来,于是出现了多余的点。
解决方案
在循环前过滤掉这两个特殊条目,同时只保留.mp3后缀的文件,避免显示非MP3格式的内容。
修改后的完整代码
<?php // Connectiegegevens $ftp_server = "myserver"; $ftp_user_name = "myuser"; $ftp_user_pass = "mypass"; $destination_folder = "/public_html/wp/wp-content/plugins/AbonneerProgrammas/Albums"; // 连接FTP并登录 $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); ftp_pasv($conn_id, true); // 获取目录内容 $contents = ftp_nlist($conn_id, $destination_folder); // 过滤掉.和..,只保留MP3文件 $filtered_contents = array_filter($contents, function($item) { $filename = basename($item); return $filename !== '.' && $filename !== '..' && pathinfo($filename, PATHINFO_EXTENSION) === 'mp3'; }); // 构建公开URL前缀(替换成你的站点实际域名) $public_url_prefix = "https://your-domain.com/wp-content/plugins/AbonneerProgrammas/Albums/"; foreach ($filtered_contents as $mp3_path) { $filename = basename($mp3_path, ".mp3"); $mp3_filename = basename($mp3_path); $mp3_url = $public_url_prefix . $mp3_filename; ?> <br> <table> <tr> <th>Programma</th> </tr> <tr> <td><a href='<?php echo $mp3_url; ?>'><?php echo $filename; ?></a></td> </tr> </table> <?php } ?>
关键修改点:
- 添加了
$filtered_contents数组过滤,去掉.、..和非MP3文件 - 定义了
$public_url_prefix,替换成你的实际站点域名,构建正确的下载URL - 从
$mp3_path中提取文件名,拼接成可访问的HTTP URL
额外建议
- 确保你的
Albums目录在服务器上设置了正确的访问权限(通常是755),否则即使URL正确,浏览器也会无法访问 - 可以给链接添加
download属性,让浏览器直接触发下载:<a href='<?php echo $mp3_url; ?>' download='<?php echo $filename; ?>.mp3'><?php echo $filename; ?></a>
内容的提问来源于stack exchange,提问作者Rezoo Aftib
相关产品推荐
相关产品推荐

