8

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

4

4 回答 4

14

默认情况下,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 没有验证/清理输入),额外的缓存等等等等。

但这应该让您了解如何针对您的问题。

于 2013-11-14T14:00:16.940 回答
7

对于我的应用程序,这些答案都不起作用——我根本无法显示图像,而且由于原因,添加一个新的 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'>";
}
于 2018-10-18T11:48:50.863 回答
4

就这么简单,这将输出具有正确标题的图像,
请记住,您必须在将任何内容从输出缓冲区中刷新之前设置 header()
=> no echo or print before

$file = '../../somedirectory/image.jpg';
header('Content-Type:image/jpeg');
header('Content-Length: '.filesize($file));
echo file_get_contents($file);
于 2013-11-14T14:06:57.860 回答
0

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

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

于 2018-03-09T05:44:59.770 回答