Php 如何在html中显示图像,同时限制对这些图像的访问?

Php 如何在html中显示图像,同时限制对这些图像的访问?,php,javascript,html,image,Php,Javascript,Html,Image,我的问题是,当您使用以下示例时: <img src="/img.jpg" /> src必须是一个图像,并且该图像必须可供人员访问。我希望能够控制对这些图像的访问(例如,如果用户已登录)。如果此人无法访问该图像,则无法访问该图像。我的控制图像访问的脚本是一个php文件 我知道.htaccess可以限制对Resources的访问,但我需要在php文件中使用有效的。有没有办法做到这一点,或者用javascript(使用ajax请求)加载图像,并将图像源更改为临时文件夹中图像的位置?您

我的问题是,当您使用以下示例时:

<img src="/img.jpg" />

src必须是一个图像,并且该图像必须可供人员访问。我希望能够控制对这些图像的访问(例如,如果用户已登录)。如果此人无法访问该图像,则无法访问该图像。我的控制图像访问的脚本是一个php文件


我知道.htaccess可以限制对Resources的访问,但我需要在php文件中使用有效的。有没有办法做到这一点,或者用javascript(使用ajax请求)加载图像,并将图像源更改为临时文件夹中图像的位置?

您可以用PHP实现这一点。。。请参阅以获取示例。。。然后,您有如下
img

<img src="/myfile.php" />

您的图像源不必指向真实图像,也不必是图像:

<img src="images.php?f=img.jpg" />

和myImage.jpg:

<?php 
$imageName = $_GET['id'];
$ctype="image/jpg";
$extension = substring($imageName, strstr($imageName, '.'));

switch($extension) {
    case "gif": $ctype="image/gif"; break; 
    case "png": $ctype="image/png"; break; 
    case "jpeg": 
    case "jpg": $ctype="image/jpg"; break; 
}
if (someValidation_here) {
    header("Content-Type: $ctype");
    $handle = fopen($imageName, "rb");
    echo fread($handle, filesize($imageName));
    fclose($handle);
}
?>

您可以在$\u会话中查看用户登录状态,并在视图部分进行检查

<?if ($_SESSION['user_status'] == 'login'){?>
  <img src="/img.jpg" />
<?}else{?>
  // some stuff instead of <img/>
<?}?>

//一些东西而不是
basename是必需的,黑客的所有密码都将存储在您的服务器上。
正确的内容类型
合理的内存消耗

使用PHP为图像提供服务 如果PHP正在输出图像内容,则可以使用PHP限制访问

通过使用src标记,您不是在使用PHP,而是您的web服务器自己提供图像

要使用PHP输出图像,请确保正确设置了头变量

例如:

<?php

if($user->isAuthenticated())
{
    $image = imagecreatefromjpeg ($server_image_path);

    header('Content-Type: image/jpeg');

    imagejpeg($image, NULL, 75);    

    imagedestroy($image);
}
else 
{
    header('HTTP/1.1 403 Forbidden');
}
?>


您可以使用AJAX和JQuery进行操作,或者在打印img之前检查用户状态,然后在查看时决定是否打印。这是我不知道如何操作的部分。。。尝试使用header发送图像并使用readfile/imagejped,但无效。也许我做错了,但是当你直接请求链接时,它会下载图像,但是当放置在src属性中时。。。图像不显示。我必须在php文件中执行什么操作。我尝试了这个解决方案,但没有成功。@maniak单击我答案中的链接查看示例-这向您展示了如何渲染自己的图像OK谢谢。。。有没有一个通用的mime图像,或者我总是要验证类型,并发送相应的mimegonna尝试与此。。。我已经在readfile/imagejpeg上尝试过类似的方法,但可能我发送了一个错误的头。如果文件很大,此解决方案可能会非常昂贵。readfile()会更好。好的,它正在工作。。。我做错了什么。也许我添加的额外标题使重新请求无效。无论如何,谢谢。@Bartek,这很容易调整;)您可以将图像的二进制文件存储在MySQL数据库中的
BLOB
字段中,并获取该文件。与此解决方案一样,如果有人足够精明,知道
img.jpg
的路径,他们可以绕过PHP验证,除非您使用其他方法进行保护(例如,将图像存储在只有脚本才能访问的目录中)。添加内容类型识别将使此解决方案更有效perfect@Bartek这是不必要的。浏览器将使用相同的标题正确显示它们
<?php 
$imageName = $_GET['id'];
$ctype="image/jpg";
$extension = substring($imageName, strstr($imageName, '.'));

switch($extension) {
    case "gif": $ctype="image/gif"; break; 
    case "png": $ctype="image/png"; break; 
    case "jpeg": 
    case "jpg": $ctype="image/jpg"; break; 
}
if (someValidation_here) {
    header("Content-Type: $ctype");
    $handle = fopen($imageName, "rb");
    echo fread($handle, filesize($imageName));
    fclose($handle);
}
?>
<?if ($_SESSION['user_status'] == 'login'){?>
  <img src="/img.jpg" />
<?}else{?>
  // some stuff instead of <img/>
<?}?>
$image = basename($_GET['image']);
if (validation()) {
    header('Content-type: image/jpeg');
    readfile($image);
} else {
    header('HTTP/1.1 403 Forbidden');
}
<?php

if($user->isAuthenticated())
{
    $image = imagecreatefromjpeg ($server_image_path);

    header('Content-Type: image/jpeg');

    imagejpeg($image, NULL, 75);    

    imagedestroy($image);
}
else 
{
    header('HTTP/1.1 403 Forbidden');
}
?>