2015-04-08 81 views
1

注意:請閱讀整個問題,直接之前,請仔細瞭解情況跳進回答部分遠程圖像顯示不工作(現在用的file_get_contents和捲曲工作)

我覺得這是一個很簡單的問題,我無法弄清楚。

基本上這個工作得很好。

URL示例: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" />'; 
?> 

但我這樣做的時候(即下面一個),它不工作,我無法弄清楚什麼地方錯誤或我在這個過程中缺少的東西。

URL示例: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); 
?> 

我是否需要設置任何類型的頭或類似的東西之前echoing 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" /> 

,以便它不會阻止的內容和亙古不顯示警告信息

注意:希望此消息對其他面臨同樣問題的人有所幫助

編輯:解決方案

我犯了愚蠢的錯誤。我試圖在使用url顯示圖像時使用data:mimetype。從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"> 
+0

我認爲這裏應該是.jpg,.png 不是.php – Saty

+0

@satishrajak不好意思,我不認爲你正確理解了這個問題。我正在使用遠程URL動態生成圖像http://website.com/default-user.png 如果你把.jpg,.png,將如何在該文件中編寫php腳本? –

回答

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); 

?> 
+0

完美的工作解決方案。我仍然困惑爲什麼我的例子沒有工作。 你介意在註釋部分解釋一下它爲什麼是一個奇怪的想法。 對我來說,這是一個非常需要的解決方案,因爲我想在我的iframe中通過SSL提供來自客戶端的http內容,並且它不允許http內容通過阻止他們在我的https服務器頁面內顯示。即這是錯誤消息:通過HTTPS加載,但請求不安全的樣式表'http://***/applist.css'。此請求已被阻止;內容必須通過HTTPS提供 –

+0

這是一個奇怪的想法,因爲這種格式爲'data:'。 $ mime。 '; base64,'。將圖像的數據直接放入html文件時使用$ base64'。當您通過uri下載圖像時,內容不是base64編碼的,它會以「Content-type」設置爲正確的MIME類型的二進制形式發送。(就像我在示例中所做的那樣) 關於您的錯誤消息,您似乎試圖通過此機制發送整個html文件,但如果不對html文件中的所有URL進行重寫/代理,它就無法正常工作。 (包括CSS ...) – mathieu

+0

啊是的,這是有道理的。可能是由於我對數據缺乏瞭解而造成的:$ mime ...大聲笑。好吧thanx幫忙。被選爲答案。 –

2

編輯:

你imageserve r.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" /> 友情提示:您必須使用標頭的內容類型,因爲Web服務器必須知道什麼是你的輸出。沒有必要使用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" />'; 
+0

同意這是應該完成的方式 –

+0

這不是我在我的問題中提出的第一個例子。請仔細閱讀問題的第二部分,並試圖說明爲什麼它不起作用。第一個是工作,但第二個部分不工作,爲什麼? –

+0

@Kristiyan everyting工作正常。我只是想,如果你把你的代碼放在這個文件abc.php中,並嘗試從另一個文件訪問bbc.php