我在PHP中使用了使用apache服务器linux的Web应用程序。出于某种安全原因,我将文档和图像保留在 Web 根目录之外。当用户登录时,我如何显示这些图像。
默认情况下,
PHP 已经可以访问 Web 根目录之外的文件,除非受到 open_basedir
指令(或安全模式,但希望你不在那个笼子里)的限制。
在虚拟主机配置中插入open_basedir
限制。您可以指定多个目录,在 Linux 上按 :
分隔,在 Windows 上指定;
。
php_admin_value open_basedir /var/www/s/stage:/usr/share/php:/your/dir
要访问这些文件,请使用绝对路径或相对于所调用 PHP 文件位置的路径。(所以你必须../
才能达到上面的水平)。
还要确保将要写入的目录分配给 Web 服务器用户并具有写入权限。
否则,您有第二种选择:
在您的 www 目录中,创建一个"image.php"文件,其内容类似于:
<?php
header('Content-Type: image/png');
readfile("../img/" . $_GET['img']);
?>
并调用您的图像
<img src="image.php?img=myimage.png" />
请注意,您的PHP文件不应该那么简单:)因为您可能希望处理多种图像格式(并为它们提供正确的标头),检查恶意文件路径/包含(您不想在不验证/清理输入的情况下使用 $_GET)、额外的缓存等。
但这应该可以让您了解如何定位您的问题。
对于我的应用程序,这些答案都不起作用 - 我根本无法显示图像,并且由于原因,我添加一个新的 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'>";
}
就这么简单,这将输出带有正确标题的图像,
请记住,在从输出缓冲区中清除任何内容之前,您必须设置 header()
=> 之前没有回显或打印
$file = '../../somedirectory/image.jpg';
header('Content-Type:image/jpeg');
header('Content-Length: '.filesize($file));
echo file_get_contents($file);
在
readfile()之前使用php的ob_clean()函数
它将用于避免空间之类的问题