2012-10-22 54 views
0

我有一個MySQL表格,我將用戶頭像存儲爲一個blob。我用一個名爲avatar.php的腳本來獲取這些圖像,該腳本輸出圖像。要請求特定的用戶圖像,您必須調用avatar.php?id =(user id)。爲了使動態圖像名稱更加美觀,我在我的.htaccess中添加了URL重寫,以便您還可以調用avatar(userid).jpg,它將在avatar.php?id =(userid)中進行翻譯。getimagesize動態圖像

現在我想獲取用戶圖像並使用GD進行操作。我嘗試使用getimagesize()和imagecreatefromjpeg(),但我不斷得到「無法打開流沒有這樣的文件或目錄」錯誤。我試圖使用這些功能的腳本,作爲avatar.php腳本,位於根目錄中。我想:

getimagesize('avatar.php?id=1'); 
getimagesize('./avatar.php?id=1'); 
getimagesize('/avatar.php?id=1'); 
...and the same but using avatar-1.jpg instead. 

當我使用我的網站的完整URL(包括http://等),它的實際工作......但是我還沒有找到原因。

// 編輯: 使用file_exists()函數時會發生類似的問題。如果我嘗試file_exists('./ avatar.php'),它會返回true,如果我添加get-vars,它將返回false。這些功能是否適合動態文件?

有人可以幫我嗎?

在此先感謝

回答

2
  1. 將圖像字符串直接從數據庫加載到變量中...不是通過getimagesize('avatar.php?id = 1');
  2. 使用imagecreatefromstring將圖像加載爲圖像對象。之後,您可以操縱圖像並將其發送到您的輸出。

如果你只是想沒有任何操作的圖像尺寸getimagesizefromstring

+0

謝謝,使用imagecreatefromstring()做了個把戲。 – carlo

1

它不工作,因爲解析和執行時getimagesize試圖打開PHP文件,而不是「圖像」的PHP文件將輸出。

這也是完整網址工作的原因:您的腳本請求從您的網絡服務器輸出,並且網絡服務器執行腳本(從DB加載圖像並輸出它)。

通過網絡服務器(使用完整的URL)加載它可能仍然是最簡單的選項。

您還可以創建與imagecreatefromstringlink)的圖像資源,給函數從DB你的結果,然後操作這些。

2

getimagesize預計文件路徑getimagesize('avatar.php?id=1')嘗試打開本地硬盤上的文件avatar.php?id=1,這當然不存在。
如果您使用getimagesize('http://example.com/avatar.php?id=1'),則可以理解該路徑是一個URL,它將通過HTTP包裝器。基本上,getimagesize仍然會認爲它打開了本地文件,但PHP會在後臺通過HTTP請求獲取該文件。由於該HTTP請求實際上正在返回一個有效的圖像文件,所以可以工作。
當然,你做而不是每次你想要打開一個圖像時都想要使用你的web服務器,因爲這是不必要的資源浪費。事實上,即使getimagesize('avatar.php?id=1')會按照您認爲的方式工作,但對於您嘗試執行的操作而言,這仍然是很大的開銷。

如果您的圖像存儲在數據庫中,請將圖像放入數據庫並將它們存儲在數據庫列中時,找出圖像尺寸一次。然後只需從數據庫中查詢大小。使用file_exists()函數時,會發生


類似的問題。如果我嘗試 file_exists('./avatar.php')它返回true,如果我添加get-vars它 返回false。這些功能是否適合動態文件?

所有這些功能預計文件路徑avatar.php是一個有效的文件名/路徑。 avatar.php?foo=bar而不是有效的文件名/路徑。後者是(部分)URL。 URL與本地文件系統無關。它們只能通過Web服務器來處理,它可能會或可能不會調用磁盤上的PHP或其他文件。您需要區分文件路徑網址的概念。

+0

我說的是和getimagesize作爲一個例子,你可以使用。實際上,我臨時在數據庫中存儲一個大圖像,我想通過imagecreatefromjpeg加載一個大圖像來製作它的縮略圖並將其存儲在數據庫的另一列中。換句話說,我必須從數據庫中獲取圖像,用GD對其進行處理,然後再將其存儲回數據庫。 – carlo

+1

是的,我希望我已清除了有關文件路徑/ URL的混淆。 'imagecreatefromjpeg'也需要一個文件路徑。如果您從數據庫中獲取圖像,則不會將其作爲文件存儲在磁盤上,也不會起作用。那麼你需要使用'imagecreatefromstring'。 – deceze

+0

謝謝,使用imagecreatefromstring()解決了這個問題 – carlo