2012-01-11 40 views
3

我使用PHP來生成圖像,這工作正常。然而,我無法顯示這些圖像:內聯生成的圖像超過長度

我的圖像生成器是一個PHP文件,它需要大量的參數和負載數據來生成圖像。由於必須將過量的數據傳遞給生成器,因此使用GET容器不適用於我,所以數據通過POST請求發送。這個請求的結果是原始圖像數據。

我使用

$result = post_request('http://myurl.com/graphx/generator.php', $data); 
if($result['status'] == 'ok') { 
    echo "<img src=\"data:image/png;base64,". 
     base64_encode($result['content'])."\"/>\n"; 
} 

,以顯示我的形象。這適用於非常小的圖像,但是當它們變大(例如300px * 300px)時,圖像不再顯示(它似乎在某處被切斷)。

我的方法合理嗎?

是否有大小問題的任何解決方法嗎?

更新:

當我讓生成器的圖像保存到文件中,所創建的文件包含圖像,我希望它是。另外,如果我的發電機轉化成GET發電機,下面的代碼工作正常,以及:

$data = http_build_query($data); 
echo "<img src=\"http://myurl.com/graphx/get_generator.php?{$data}\"/>\n"; 

所以它肯定似乎是無論是POST請求,或轉換成base64格式的問題。我正在使用POST請求,如here所示。

+0

更大圖像的$結果的輸出是什麼?在這種情況下你能夠獲得內容密鑰嗎? – Stewie 2012-01-11 14:47:22

+0

@Stewie我能夠獲得內容密鑰,它包含'base64'數據,但它似乎被限制在一定的長度。 – nijansen 2012-01-11 14:55:30

回答

3

我建議讓您的網頁是這樣的結構:

主頁:

<img src="imageproxy.php" /> 

imageproxy.php:

<?php 
$result = post_request('http://myurl.com/graphx/generator.php', $data); 
header('Content-type: image/png'); 
if($result['status'] == 'ok') { 
    echo $result['content']); 
} else { 
    readfile('error_message_image.png'); 
} 

,而不是試圖用數據URI來工作,長度限制,只需讓您的代理腳本輸出實際的原始圖像數據,並將其視爲客戶端html中的圖像。

+0

輝煌。這正是我正在尋找的想法。 – nijansen 2012-01-11 15:30:24

1

你爲什麼不Base64編碼的參數,並放進了GET請求,並做一個簡單:

<img src="/path/to/php.php?p=eyJ0aGlzIjoiaXMiLCJhIjoiYmVhdXRpZnVsIiwic2V0Ijoib2YiLCJwYXJhbWV0ZXJzIjoiISEifQ==" /> 

然後在php.php BASE64_DECODE($ p)和返回圖像。

更妙的php.php,使用Apache(https://tn123.org/mod_xsendfile/)的X-SENDFILE MOD,也許緩存的形象,以及在本地,這樣你就不必重新創建這一切的時候

編輯:

我不知道我們在這裏討論的究竟有多少個參數。如果你去看看What is the maximum length of a URL in different browsers?,你會發現這個經驗表明一個URI大約在2000個字符左右。

因此,這取決於您的base64編碼字符串是否比您安全。否則,你可以考慮替代的編碼方式。也許yEnc或base85?

更進一步,你可以做存儲序列化對象(含必要的參數)上的本地存儲(即RDBMS),與ID鏈接它和周圍傳遞ID。當php.php得到的是id時,在存儲器上查找它檢索參數創建圖像等等。

+0

我特別感興趣的第一個建議:這會幫助我嗎?說實話,我不是很擅長通過HTTP進行GET請求,我能夠在將其編碼爲'base64'並將其作爲單個參數發送時發送無限量的數據? – nijansen 2012-01-11 15:23:41

+0

哪個仍然會失敗。 GET查詢的長度有限,並會截斷一行中的「大」圖像。 – 2012-01-11 15:25:17

+0

我將編輯我的帖子以回覆@MarcB和nijansen,因爲我的空間不足。 – mobius 2012-01-11 15:31:54

1

根據http://en.wikipedia.org/wiki/Data_URI_scheme IE 8(可能低於如果支持的話)「的限制數據URI爲32 KB的最大長度」。這可能是你看到的,如果它只讀取你發送它的第一個32K。

+0

這是非常有用的信息。那我該如何解決這個32KB的限制? – nijansen 2012-01-11 15:28:04

+0

我認爲馬克B的答案可能是最好的選擇。做你現在正在做的事情,但將該代碼提取到另一個只包含圖像內容的頁面,以便它可以返回圖像。 – Chris 2012-01-11 15:29:29