台灣最大程式設計社群網站
線上人數
1162
 
會員總數:243311
討論主題:188091
歡迎您免費加入會員
討論區列表 >> PHP >> 利用GD2後,生成圖片存圖問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
利用GD2後,生成圖片存圖問題
價值 : 20 QP  點閱數:365 回應數:14

樓主

小Z
門外漢
0 1
53 4
發送站內信

請教各位先進

目的是要儲存網頁上用GD2繪出的圖片,
參考一些網上範例,目前都未成功,
想請教正確的使用函數與觀念,謝謝。

(原)主網頁程式碼:
';</pre> //利用GD2繪出圖片
以原程式碼,可以正確跑出圖片。


嘗試但失敗的程式碼↓

若要達成目的,是使用 imagegd2 函數嗎?
圖片儲存,最後會存在使用者端的電腦,還是伺服端的電腦?

搜尋相關Tags的文章: [ PHP ] , [ GD2 ] , [ 儲存圖片 ] ,
本篇文章發表於2018-04-26 10:19
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
你並未說失敗的詳細情況,我只好用猜的了。

這堭q程式來看,有發現幾個重點。
首先是相對路徑的問題。
1.在程式碼中,並不確定你第二支程式與第一支程式是否位在同一個目錄層。
如果不是,那就很有可能會發生路徑的運行錯誤問題。

2.再來,你雖然是用php來做產生圖片的方式。但是~~~~
你第二支程式第1行的運用。它並不會幫你去運行php的程式才對。只是幫你載入此php的程式碼。
(也就是程式載入式而非運行式)。你自然就無法去獲得你想要的圖片。
相信你因該會在第2行的判斷中,取到空或是錯誤的訊息才對。

3.所有的操作一定都是在伺服端的電腦。不要忘了,php的運行並不會在前端運行。它是後端運行應用。
也就是它只會跑程式後,輸出成html碼之後才給瀏覽器去跑。
最簡單的理解方式,就是你可以在瀏覽器中輸出原始碼,保証看不到任何一個跟php有關的程式碼。
只能看到html碼。

且基於本機安全性原則。不可能讓一個遠端的網頁程式可以插一個檔案到客戶端。
如真的可以這樣的話。早就出現超多的惡意網站了。
本篇文章回覆於2018-04-26 17:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

小Z
檢舉此回應
感謝版主指教

抱歉表達有誤。兩段程式碼是在同一張網頁內,但是產生圖片的 Code 和網頁是不同檔案。


錯誤訊息:failed to open stream: Invalid argument in A.php on line 266

Chart_Day.php 與 A.php,兩個網頁並不在同一路徑。但可以正常顯示,路徑應該不是問題。

imagegd2函數不是用在這情況?!


本篇文章回覆於2018-04-26 18:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

淺水員
檢舉此回應
可以用 curl 去抓網站的內容儲存到檔案

本篇文章回覆於2018-04-27 00:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

淺水員
檢舉此回應
忘了說,上面那個是儲存在伺服器的。
如果是要儲存在客戶端電腦,必須是使用者點擊連結下載才可以。
可參考:HTML <a> download Attribute
本篇文章回覆於2018-04-27 00:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

小Z
檢舉此回應
以 function saveUrlAsFile 測試

failure:
Resolving host timed out: ..

使用者端讀到的圖片路徑是
<img src="../PIC/Chart_Day.php?id=AB10_chart_20180427" border=0>

是不是『非圖檔』,就會失敗。
本篇文章回覆於2018-04-27 09:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

淺水員
檢舉此回應
請用完整url,例如http://開頭的字串
PS.可利用$_SERVER參數將相對路徑改寫為絕對路徑
本篇文章回覆於2018-04-27 11:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
我想,你還不太懂我說的東西。
imagegd2這個函數,第一個參數就是要獲取的圖檔資料。
我很清楚你的 「../PIC/Chart_Day.php?id='.$temp.'」
就是一個用php來運行獲取一個圖檔資料。

但你搞錯的地方是,「載入」跟「執行」
你的Chart_Day.php這一支,必需要「執行」的動作,才會去生成你要的圖檔資料。

所以,你在<img中使用該php,它是用「執行」的方式來運行的。自然就可以獲取圖檔。

可是你在imagegd2第一個參數。他是一個「載入」的動作。它並不會去運行。
也就是說,你認為他是要運行一個php。但他實際上,只是載入了一個「../PIC/Chart_Day.php?id='.$temp.'」字串而已。
這並不是圖檔資料。所以他會無法辨別這是一個圖片,(這也是理所當然的是,因為他是一段字串)。
自然就給你報錯了

只是我這邊因該會寫個程式測試一下。
因為我對你出現的錯誤訊息感到有點奇特。除非你的說明錯了。

因為錯誤訊息「failed to open stream」理論上是屬於開啟檔案才會碰上的錯誤訊息。
這的確讓我有點無法確認你的問題。

至於關於圖片下載的部份,除了可以利用curl之外。其實如果有其必要的話。你也可以在Chart_Day.php就做檔案生成處理。
使用fopen跟fread跟寫入的方式,就可以建立一個圖片檔。
這樣就可以簡單的用一般連結的方式處理了。

如果不行,大多數會考量容量的問題。
那就將其程式碼寫成直接輸出並將標頭宣告為下載模式就好。這樣就可以直接變成下載。

其實你只要將Chart_Day.php做成物件的方式就很好應用了。可能再多個get參數,看是要直接輸出圖還是要做下載處理。
不需要將下載用另外的方式來處理。

ps:不要再去想自動下載到客戶端這樣的操作。不可能的事就是不可能。
因為如果有可能辦到的話。早就出現一堆惡意網站了。
本篇文章回覆於2018-04-27 12:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

淺水員
檢舉此回應
試試看這樣吧?

本篇文章回覆於2018-04-27 12:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
不錯的參考

淺水員
檢舉此回應
其實最好的方式還是如7F所言,直接在 Chart_Day.php 處理比較好
對自己的網站送出請求(也就是curl真正做的事情)還滿有多此一舉的感覺

每次看到版主的回應我都覺得自己太懶(直接丟程式碼),想好好說明又覺得要打很多字…
不過說實話,觀念的確比程式碼重要

下面是我想這問題的思路:
1F的第一段程式碼,我看到 <img src="php網址">
其實我是第一次看到這種寫法
但是我知道 src 後面接的只有2種東西
一種是帶mime的base64字串,一種是遠端資源網址
因為那是網址,所以我判斷這邊應該是後者(即便以前都只看過圖檔而不是php)

平時如果是圖檔網址
用瀏覽器去看網頁請求的紀錄
會看到這些 img 的 src 會產生 http 請求來取得資料
所以我想如果 php 回傳也是圖片資料應該也可

再來看到 1F 第 2 段程式碼後
因為沒用過 GD
我去查詢 imagegd2 的用法
發現 imagegd2 的第一個參數是一個 image 資源
通常文件寫的"資源(resource)" 通常是由其他函式產生
這邊只是放一個 url 感覺就很有問題
其次 imagegd2 回傳的資料型態是 bool
而後面又把這個只是儲存 bool 的變數當作參數送給 imagepng …

看到這邊其實會覺得樓主需要多習慣去看文件還有注意資料型態的部分
而不是盲目地拼拼湊湊

如果學會看文件跟注意資料型態
那麼也許會發現應該可以用 imagecreatefrompng
因為那函式有明確寫出接受 url 作為參數
並且回傳一個 resource
那麼這個 resource 就應該可以送給 imagepng 了
未必要使用 curl 的方法

除了 curl 外
要取得 url 回傳的內容方式還有很多
例如這網站就寫了6種方法:https://oscarliang.com/six-ways-retrieving-webpage-content-php/
但是本質都是 http request
(根據文件內容 imagecreatefrompng 其實應該也是用到 fopen 來做 http request)

回到原本的需求
如果 Chart_Day.php 是自己能動的東西
那麼不透過 http request 而直接把東西存到伺服器會更有效率
本篇文章回覆於2018-04-27 13:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
對了,剛忙忘了要再糾正一件事
有關你說的
「Chart_Day.php 與 A.php,兩個網頁並不在同一路徑。但可以正常顯示,路徑應該不是問題。」

這點最好你不要用肯定句。
因為你要知道一件事,所謂的路徑,還分web路徑及主機路徑。

而且還得了解這是直接性的php還是view性的載入式輸出。
當然,如果是屬於直接性的。也就是是用url直接運行的。
大多數來說路徑位置都是同一個地方。的確會比較不會有相對路徑不同的問題。

但如果是採用載入式的輸出方式。其主機的相對路徑跟web的相對路徑就會有所不同。

但如果是用絕對性的指定。也就是上面有說到的用http開頭的。那其程式就會統一用web路徑處理。

也就是說,用html碼所運行的路徑位置。跟用php語法所運行的路徑位置。
可是不一定是在同一個位置。

所以千萬不要認為兩者的路徑宣告的位置是相同的。在無法確定的情況下。最好還是做一下路徑檢查。
本篇文章回覆於2018-04-27 14:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

小Z
檢舉此回應
感謝前輩們指導

使用淺水員前輩的function
成功產生圖檔,但圖片內容是 無Data
我猜是後面的 id 的變數沒成功傳遞,所以才無Data。
(雙引號、單引號、斜線、反斜線,都重覆測過,但一直沒試成功。)

版主提及...
可以在Chart_Day.php就做檔案生成處理。

以Stroke當關鍵字,查到一些範例
在Chart_Day.php最後加上程式碼


圖片被儲存在伺服端網頁的相對路徑下。

但還沒找到fopen和fread對存圖相關的用法。

再次感謝淺水員與版主的熱心指導。
本篇文章回覆於2018-04-27 17:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

淺水員
檢舉此回應
想問:原本的 Chart_Day.php 裡面是用 jpgraph 函式庫寫的嗎?
11F 那些程式碼是可以跑的嗎?(因為 jpgraph 不算是常見的 extenstion ,要另外去裝)

11F 裡面的 $graph 變數是原本程式就產生的嗎?

另外我看 11F的第4行是寫到檔案中
11F 的第 6~7 行是輸出圖檔資料
但是你又說這些程式碼是加在原本的程式後面
那不就變成同樣的內容輸出了2次?
<img src="Chart_Day.php?id=...">不就壞掉了?
本篇文章回覆於2018-04-27 22:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

淺水員
檢舉此回應
我誤會了 JpGraph 只是 php library 而不是 extension
本篇文章回覆於2018-04-28 00:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

小Z
檢舉此回應
這是Chart_Day.php前段Code

本篇文章回覆於2018-04-28 10:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.