[ASP.NET] 如何透過 HTTP Handler 讓 Web 專案中的圖片 Response 時加上指定的文字(轉)

[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】

 

   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,設定步驟如下
        1. 開啟IIS
        2. 找到您的Web專案
        3. 滑鼠右鍵→內容→【目錄】頁籤
        4. 確認是否有建立為應用程式
        5. 按下【設定】開啟【應用程式設定】視窗
          1. 在應用程式副檔名中【新增】
          2. 執行檔後的【瀏覽】,找到
            C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
          3. 副檔名輸入【jpg】
          4. 按下【確定】
      • 經過這樣的設定後,就可以瀏覽該專案中的 jpg 會在左上角加上指定的文字了。