2016-01-19 68 views
-1

我正在设置一个随机图像功能,但试图在处理随机数发生器之前证明这个概念。如何返回图像从php文件设置为img src

现在我有一个test.php文件。它包含:

<?php 
$img = 'http://example.com/img.jpg'; 
$fp = fopen($img, 'rb'); 


header('Content-type: image/jpeg;'); 
header("Content-Length: " . filesize($img)); 

fpassthru($fp); 
exit; 
?> 

然后在另一个HTML文件我有<img src="test.php">

的目标就是返回图像。图片url的作品是正确的,test.php返回一个200.但图片只是显示了一个破碎的图像图标。

我也试过readfile()没有运气。

我只是想显示这个图像。

+0

使用路径而不是url。编辑:如果该v v v不是alllowed –

+0

是否在您的服务器上启用了'allow_url_fopen'? – Matt

+0

是的,allow_url_fopen已启用。 –

回答

2

filesize不适用于HTTP URL。 docs说:

此函数也可以用于一些URL包装。请参阅支持的协议和包装以确定哪些包装支持stat()系列功能。

但是,HTTP wrapper不支持stat函数。因此,您发送错误的Content-Length标题,并且HTTP响应无法被浏览器解释。

我看到了两个可能的解决方案:

  1. 加载图像到内存中,并使用strlen

    $image = file_get_contents('http://example.com/img.jpg'); 
    
    header('Content-type: image/jpeg;'); 
    header("Content-Length: " . strlen($image)); 
    echo $image; 
    
  2. 使用$http_response_header变量来读取远程响应的Content-Length标题:

    $img = 'http://example.com/img.jpg'; 
    $fp = fopen($img, 'rb'); 
    
    header('Content-type: image/jpeg;'); 
    foreach ($http_response_header as $h) { 
        if (strpos($h, 'Content-Length:') === 0) { 
         header($h); 
         break; 
        } 
    } 
    
    fpassthru($fp); 
    
+0

写得很好的答案helmbert! – Darren

+0

成功使用选项1,谢谢。 –

0

另一种选择是使用一些内置的函数来生成/操作图像 - 下面的代码是用于png的,但是对于jpg,gif和bmp存在类似的函数。

使用URL作为文件路径依赖于该设置你的主机被启用(上开发很明显,你控制它是否被启用与否)

使用这些功能还允许您在添加自己的文本的可能性运行时,结合图像和各种其他很酷的东西。

<?php 

    if(ini_get('allow_url_fopen')){ 
     $imgPath='http://localhost/images/filename.png'; 
    } else { 
     $imgPath=realpath($_SERVER['DOCUMENT_ROOT'].'/images/filename.png'); 
    } 

    header("Content-type: image/png"); 
    $image = imagecreatefrompng($imgPath); 
    imagesavealpha($image,true); 
    imagealphablending($image,true); 
    imagepng($image); 
    imagedestroy($image); 
?>