[ASP.NET] 如何透過 HTTP Handler 讓 Web 專案中的圖片 Response 時加上指定的文字(轉)
這兩天在網路上逛街的時候,
看到「Topcat」的一篇文章
「如何透過 HTTP Handler 讓 Web 專案中的圖案(JPG)Response時加上指定的文字」
因為之前大多都另外使用 ashx 檔案重繪圖片,
輸出時在使用者網頁上看到的連結也大多會是 *.ashx,看久了總覺得很怪╰(‵□′)╯
還好有看到這篇文章,在此先謝謝 Cat 大大…
以下,轉錄自「topcat 姍舞之間的極度凝聚」
另外,請 Cat 大大恕我修改了 小…小…小…部份
============================================================================
我們經常可以在別的網站看到,當上傳圖片到網站後,顯示出來的圖片會加上一個該網站的名稱文字,或者是加上該網站的Logo。
這個部分可以透過「HTTP Handler」來實踐他。
何謂「HTTP Handler」?請參考這一篇【ASP.NET Request處理的過程】
了解了「HTTP Handler」在 ASP.NET Request 處理過程所扮演的角色與位置後,接著就來看看如何撰寫「HTTP Handler」。
-
撰寫「HTTP Handler」
-
首先在您的專案中,增加一個新的項目,選擇【Class】。
如果您的專案中沒有App_Code的目錄,他會自動的問您是否將 Class 存放在 App_Code 目錄中,請選擇是,該 Class 的檔案名稱為【JPGHandler.vb】
-
首先在您的專案中,增加一個新的項目,選擇【Class】。
1: Imports Microsoft.VisualBasic
2: Imports System.Web
3: Imports System.Drawing
4: Imports System.Drawing.Imaging
5: Imports System.IO
1: Public Class JPGHandler
2: Implements IHttpHandler
3:
4: End Class
1: Public ReadOnly Property IsReusable() As Boolean _
2: Implements System.Web.IHttpHandler.IsReusable
3: Get
4:
5: End Get
6: End Property
7:
8: Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) _
9: Implements System.Web.IHttpHandler.ProcessRequest
10:
11: End Sub
-
- 我們先將會用到的 Namespace Imports進來
- 接著,要實作【IHttpHandler】介面
- 當輸入了【Implements IHttpHandler】按下Enter後,會自動把相關的語法產生如下:
1: Public ReadOnly Property IsReusable() As Boolean _
2: Implements System.Web.IHttpHandler.IsReusable
3: Get
4: Return True
5: End Get
6: End Property
1: Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) _
2: Implements System.Web.IHttpHandler.ProcessRequest
3:
4: '設計您要加上的文字
5: Dim s As String = "Topcat--姍舞之間的極度凝聚"
6: '定義資料路徑
7: Dim JpgFile As String = context.Request.PhysicalPath
8: '取得 Jpg Image
9: Dim Jpg As Image = Image.FromFile(JpgFile)
10: '宣告 Graphics 讀取 Jpg
11: Dim Gphs As Graphics = Graphics.FromImage(Jpg)
12: '宣告使用的字體、大小、型態
13: Dim Fnt As New Font("標楷體", 14, FontStyle.Bold)
14: '設定顏色
15: Dim Brsh As New SolidBrush(Color.Yellow)
16: '畫上文字
17: Gphs.DrawString(s, Fnt, Brsh, 0, 0)
18: '輸出處理好的圖形
19: Dim ms As MemoryStream = New MemoryStream
20: Jpg.Save(ms, ImageFormat.Jpeg)
21: Gphs.Dispose()
22: Jpg.Dispose()
23:
24: context.Response.Clear()
25: context.Response.ContentType = "image/jpeg"
26: context.Response.BinaryWrite(ms.ToArray())
27: context.Response.End()
28: End Sub
-
- 先設定讓 IsReusable 的屬性回傳為 True
- 接著撰寫處理 ProcessRequest 的部分
1: <system.web>
2: <httpHandlers>
3: <add verb="*" path="*.jpg" type="JPGHandler"/>
4: </httpHandlers>
5: </system.web>
-
- 接著,就要設定 Web.Config 指定副檔名用哪個 Handler 處理
-
測試運作程式
- 以上這樣就完成的程式的撰寫的部分,但是實際上要運作時卻有需要注意的地方,首先如果您是使用檔案類型開啟專案,那麼不用作其他的設定,就能夠直接的看到效果
- 但是如果您是透過IIS來瀏覽,那麼還要做一個設定,就是指定副檔名 jpg 要使用 isapi 來處理,小喵測試過使用XP Pro內的IIS,要做這樣的設定卻會發生無法按【確認】按鈕,小喵猜測可能是 XP Pro IIS 的 Bug 吧!!
- 如果是2000 Server或者2003 Server,設定步驟如下
-
-
-
- 開啟IIS
- 找到您的Web專案
- 滑鼠右鍵→內容→【目錄】頁籤
- 確認是否有建立為應用程式
-
按下【設定】開啟【應用程式設定】視窗
- 在應用程式副檔名中【新增】
-
執行檔後的【瀏覽】,找到
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll - 副檔名輸入【jpg】
- 按下【確定】
-
-
-
-
- 經過這樣的設定後,就可以瀏覽該專案中的 jpg 會在左上角加上指定的文字了。
-