【问题标题】:display the content of a folder显示文件夹的内容
【发布时间】:2012-10-20 00:01:02
【问题描述】:

我有以下 PHP 代码来显示我网站中目录的内容:

<?php
$conn = ftp_connect("host") or die("Could not connect");
ftp_login($conn,"username","password");

if ($_GET['dir'] != null) {
    ftp_chdir($conn, "logs/{$_GET['dir']}");
}
else
{
    ftp_chdir($conn, "logs");
}

$files = ftp_nlist($conn,"");

foreach($files as $value) {
    echo "<a href=\"test.php?dir={$value}\">{$value}</a>";
}

ftp_close($conn);
?>

This is my webpage

当我点击 subdirectory1 或 subdirectory2 时,我会得到它的内容(一些图像)。然后当我点击其中一张图片时,我会得到我网站根目录的内容。

当访问者点击图片时,如何只显示图片?请注意,我不想下载它或任何东西 - 我只想在访问者点击它时在浏览器中显示它。

【问题讨论】:

    标签: php ftp


    【解决方案1】:

    您需要确定哪些返回的项目是文件,哪些是目录。为此,您最好使用ftp_rawlist,因为它允许提取更多数据。然后为每个案例创建链接,以便您可以适当地处理它们。这是一个可能的实现:

    $ftpHost = 'hostname';
    $ftpUser = 'username';
    $ftpPass = 'password';
    $startDir = 'logs';
    
    if (isset($_GET['file'])) {
        // Get file contents (can also be fetched with cURL)
        $contents = file_get_contents("ftp://$ftpUser:$ftpPass@$ftpHost/$startDir/" . urldecode($_GET['file']));
    
        // Get mime type (requires PHP 5.3+)
        $finfo = new finfo(FILEINFO_MIME);
        $mimeType = $finfo->buffer($contents);
    
        // Set content type header and output file
        header("Content-type: $mimeType");
        echo $contents;
    }
    else {
        $dir = (isset($_GET['dir'])) ? $_GET['dir'] : '';
    
        $conn = ftp_connect($ftpHost) or die("Could not connect");
        ftp_login($conn, $ftpUser, $ftpPass);
    
        // change dir to avoid ftp_rawlist bug for directory names with spaces in them
        ftp_chdir($conn, "$startDir/$dir");
    
        // fetch the raw list
        $list = ftp_rawlist($conn, '');
    
        foreach ($list as $item) {
            if(!empty($item)) {
                // Split raw result into pieces
                $pieces = preg_split("/[\s]+/", $item, 9);
    
                // Get item name
                $name = $pieces[8];
    
                // Skip parent and current dots
                if ($name == '.' || $name == '..')
                    continue;
    
                // Is directory
                if ($pieces[0]{0} == 'd') {
                    echo "<a href='?dir={$dir}/{$name}'><strong>{$name}</strong></a><br />";
                }
                // Is file
                else {
                    echo "<a href='?file={$dir}/{$name}'>{$name}</a><br />";
                }
            }
        }
    
        ftp_close($conn);
    }
    

    【讨论】:

    • 我得到了目录“logs”的内容+同一页面中所有子目录的内容! link to my page
    • 我刚刚测试了我的答案中的代码,它对我来说工作得很好(尽管我正在测试的 ftp 服务器在 Windows 机器上)。您是从答案中复制/粘贴代码还是对其进行了一些更改?
    • 你能把var_dump($list); 的输出贴出来让我看看它获取的结构吗?
    • 你能给我你的电子邮件吗?我会用我的 ftp 信息登录和所有信息与你联系。你告诉我有什么问题吗?我的网站是试用版 .. 我刚开始构建它,它是一个免费的 ftp 帐户 .. 没有付费主机大声笑(6te.net)
    • 首先,我不会在这里公开我的电子邮件。其次,你要我为你做这项工作。你应该查看我提供给你的代码,试着理解它,如果有什么你不明白的地方,请让我解释它们或提供参考资料供你阅读(我会很乐意这样做)。或者在这种情况下,只需发布​​我要求的信息(如果可能),以便我可以进一步帮助您。如果您是初学者,我可以理解,但您需要了解事情如何运作才能变得更好。让这个社区的用户为你做这项工作不会让你走得太远。
    【解决方案2】:

    您需要添加一个函数来检查我们正在处理的文件类型。 如果是目录,则显示常规链接(您现在正在使用的链接),如果是图像 显示带有图像路径的链接。

    因为$value 包含文件的名称,您可以使用end(explode('.',$value)); 来查找分机。文件(php、jpg、gif、png)。 对这条信息使用另一个条件,您可以识别它是否是图片。

    为了构建图像的path,您需要使用$_GET['dir'] 变量的值。 例如:

    <a href='<?=$_GET['dir']?>/Flower.gif'>Flower.gif</a>
    

    我希望你明白了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 2016-05-30
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      相关资源
      最近更新 更多