远程图像显示不起作用(现在使用file_get_contents和curl工作)

时间:2015-04-08 09:22:25

标签: php

注意:在直接跳到答案部分之前,请仔细阅读整个问题并仔细了解方案

我认为这是一个非常简单的问题,我无法弄清楚。

基本上这个工作得很好。

示例网址:http://localhost/test/image.php

文件名:image.php文件

<?php
// $url = $_GET['url'];
$url = 'http://google.com/images/srpr/logo11w.png'; 
function data_uri($file) 
{  
    $contents = file_get_contents($file);

    $finfo = new finfo(FILEINFO_MIME);
    $mime = $finfo->buffer($contents);
    PHP_EOL; 

    $base64   = base64_encode($contents); 
    return ('data:' . $mime . ';base64,' . $base64);
}
echo '<img src="' .  data_uri($url) . '" alt="Test image" />';
?>

但是当我这样做时(即下面的那个),它不起作用,我无法弄清楚出了什么问题或者我在这个过程中缺少了什么。

示例网址:http://localhost/test/displayimage.php

文件名:displayimage.php

<img src="http://localhost/test/imageserver.php" alt="image not displaying">

图片服务器文件 文件名:imageserver.php

<?php
// $url = $_GET['url'];
$url = 'http://google.com/images/srpr/logo11w.png'; 
function data_uri($file) 
{  
    $contents = file_get_contents($file);

    $finfo = new finfo(FILEINFO_MIME);
    $mime = $finfo->buffer($contents);
    PHP_EOL; 

    $base64   = base64_encode($contents); 
    return ('data:' . $mime . ';base64,' . $base64);
}
echo data_uri($url);
?>

在回显data_uri之前,是否需要设置任何类型的标题或类似的东西。欢迎任何快速建议,使其在第二个网址中工作。

我试图实现此目的的原因

我正在尝试显示可能通过http提供的客户端网站内容,但我的服务器使用SSL并且它给了我这个错误:混合内容:'http://***/applist.css'页面。此请求已被阻止;内容必须通过HTTPS提供。通过这种方法,我试图将http内容作为我的页面的包装器提供,这是我的服务器内部,即调用页面作为https请求,以便我可以摆脱这个警告消息和浏览器阻止内容。我正在尝试将非SSL(http)内容服务到我的SSL(https)服务器,如下所示:

<img src="https://mywebsite.com/imageserver.php?url=http://php.net/images/logo.php" /> 

这样它就不会阻止内容而且不会显示警告信息

注意:希望此消息对面临同样问题的其他人有所帮助

已编辑:解决方案

我犯了傻傻的错误。我尝试使用数据:mimetype,同时使用url显示图像。来自Remote image display is not working (now working using file_get_contents and curl)的解决方案非常有效地提及了这个答案Remote image display is not working (now working using file_get_contents and curl)

解决方案代码:

<?php
// $url = $_GET['url'];
$url = 'http://google.com/images/srpr/logo11w.png';   
function data_uri($file) 
{   
    $contents = file_get_contents($file);

    $finfo = new finfo(FILEINFO_MIME);
    $mime = $finfo->buffer($contents);

    return array($mime, $contents);
}
list($mime, $content) = data_uri($url);
header('Content-type: '.$mime);
die($content);
?>

如果有人对使用curl而不是file_get_contents的解决方案感兴趣,下面的替代解决方案将完全正常,我在等待上述代码的解决方案时找到了。 (http://ryansechrest.com/2012/07/send-and-receive-binary-files-using-php-and-curl/

文件名:imageserver_curl.php

<?php 
// $url = $_GET['url'];
$url = 'http://php.net/images/logo.php';    
$token = 'N43feedfggsaedwufvworuworjslfurw';

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);

$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);

foreach($header_array as $header_value) {
    $header_pieces = explode(':', $header_value);
    if(count($header_pieces) == 2) {
        $headers[$header_pieces[0]] = trim($header_pieces[1]);
    }
}

header('Content-type: ' . $headers['Content-Type']);
// header('Content-Disposition: ' . $headers['Content-Disposition']); #download option

echo substr($file_array[1], 1);

像这样使用

文件名和网址:http://localhost/test/displayimage.php

<img src="http://localhost/sandbox/securecontent/imageserver_curl.php"> 

2 个答案:

答案 0 :(得分:2)

<强>编辑:

你的imageserver.php应该是:

header('Content-Type: image/png');
$url = 'http://php.net/images/logo.php';   
function data_uri($file) 
{  
    $contents = file_get_contents($file);
    return $contents;
}
echo  data_uri($url);

您的观点:<img src="imageserver.php" alt="Test image" /> 提示:您必须使用标题内容类型,因为网络服务器必须知道您的输出是什么。没有必要使用base64。您必须仅返回内容。

OLD:

经过测试和工作。 PHP 5.6.3 JPG和PNG文件。

$url = 'http://php.net/images/logo.php';   
function data_uri($file) 
{  
    $contents = file_get_contents($file);
    $base64   = base64_encode($contents); 
    return ('data:;base64,' . $base64);
}
echo '<img src="' .  data_uri($url) . '" alt="Test image" />';

答案 1 :(得分:1)

您正在尝试远程发送内联数据......这是一个奇怪的想法,我不确定浏览器是否了解您要实现的目标...

imageserver.php

<?php
$url = 'http://google.com/images/srpr/logo11w.png';   
function data_uri($file) 
{  
    $contents = file_get_contents($file);

    $finfo = new finfo(FILEINFO_MIME);
    $mime = $finfo->buffer($contents);

    return array($mime, $contents);
}
list($mime, $content) = data_uri($url);
header('Content-type: '.$mime);
die($content);

?>