【问题标题】:How can i show the images outside the web root directory in my php application?如何在我的 php 应用程序中显示 web 根目录之外的图像?
【发布时间】:2013-11-27 13:47:27
【问题描述】:

我在 PHP 中有一个使用 apache 服务器、linux 的 web 应用程序。出于某种安全原因,我将文档和图像保留在 Web 根目录之外。当用户登录时,我如何显示这些图像。

【问题讨论】:

    标签: php linux apache


    【解决方案1】:

    默认情况下,PHP 已经可以访问 web 根目录之外的文件,除非受到 open_basedir 指令的限制(或安全模式,但希望你不在那个笼子里)。

    在 VirtualHost 配置中插入open_basedir 限制通常是一个好习惯。您可以指定多个目录,在 Linux 上以 : 分隔,在 Windows 上以 ; 分隔。

    php_admin_value open_basedir /var/www/s/stage:/usr/share/php:/your/dir
    

    要访问这些文件,请使用绝对路径或相对于所调用 PHP 文件位置的路径。 (所以你必须../ 才能达到以上级别)。

    还要确保您要写入的目录已分配给网络服务器用户并具有写入权限。

    否则你有第二个选择:

    在您的 www 目录中,创建一个“image.php”文件,其内容类似于:

    <?php
      header('Content-Type: image/png');
      readfile("../img/" . $_GET['img']);
    ?>
    

    并用

    调用您的图像
    <img src="image.php?img=myimage.png" />
    

    请注意,您的 PHP 文件不应该那么简单 :) 因为您可能想要处理多种图像格式(并为它们提供正确的标题),检查恶意文件路径/包含(您不希望使用 $_GET 而不验证/清理输入),额外的缓存等等等等。

    但这应该让您了解如何定位您的问题。

    【讨论】:

    • 有可能,但答案不一样。
    • 我使用了类似的方法来防止缓存图像。 $r = 兰德(1,9999); print '';
    【解决方案2】:

    对于我的应用程序,这些答案都不起作用——我根本无法显示图像,而且由于原因,添加一个新的 php 文件来调用对我来说并不可行。对我有用的是

    $filename = read_filename_from_database;
    $fileDir = "/path/to/files/";
    $file = $fileDir . $filename;
    if (file_exists($file))
    {
         $b64image = base64_encode(file_get_contents($file));
         echo "<img src = 'data:image/png;base64,$b64image'>";
    }
    

    【讨论】:

    • 简单、干净、聪明的解决方案。谢谢!
    • 但是如果我们使用 JavaScript 来显示这些图像呢?
    【解决方案3】:

    就这么简单,这将输出带有正确标题的图像,
    请记住,在将任何内容从输出缓冲区中刷新之前,您必须设置 header()
    => 之前没有回显或打印

    $file = '../../somedirectory/image.jpg';
    header('Content-Type:image/jpeg');
    header('Content-Length: '.filesize($file));
    echo file_get_contents($file);
    

    【讨论】:

      【解决方案4】:

      在readfile()之前使用php的ob_clean()函数

      避免类似空格的问题会很有用

      【讨论】:

        猜你喜欢
        • 2017-10-09
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        相关资源
        最近更新 更多