ASP.NET 3.5核心編程學習筆記(43):HTTP處理常式的編寫之圖片查看器

來源:互聯網
上載者:User

圖片查看器處理常式

  為加快處理速度,IIS會直接處理Web應用程式中的某些靜態資源,而不會調用ISAPI擴充。這些靜態檔案包括映像和HTML檔案。如果從瀏覽器直接請求gif或jpg檔案,IIS會擷取指定的資源,正確設定響應緩衝的內容類型,並將其輸出成檔案的位元組流.

  如果瀏覽器地址指向包含多個映像的虛擬目錄呢?在這種情況下,IIS無法識別檔案夾的內容,而可能只返迴文件的列表。

  那麼如何?指向該虛擬目錄地址,在瀏覽器中顯示該目錄片的預覽呢?

圖片查看器HTTP處理常式的設計

  首先,需要確定如何使IIS知道我們的意圖?可以通過在檔案夾名稱後追加一個特定的端點,使IIS將請求傳給ASP.NET,由ASP.NET來提供其中映像的預覽。換言之,這個思路是,將圖片查看器處理常式與一個特定的端點(如folder.axd)綁定。固定端點所指向的不必一定是已經存在的、已部署好的資源,將folder.axd追加到檔案夾名之後即可。如下地址所示:

  http://www.contoso.com/images/folder.axd

  處理常式此時要做的是,提取URL中檔案夾名,並選出其中的圖片以預覽。

  在ASP.NET中,axd副檔名通常用於引用特殊服務。用於跟蹤的Trace.axd,及用於插入指令碼和資源的WebResource.axd,都是使用該副檔名的典型案例。

圖片查看器HTTP處理常式的實現

  圖片查看器處理常式要返回一個包含指定檔案夾中所有映像的多列表格。該類的結構如下:

class PictureViewerInfo
{
public PictureViewerInfo()
{
DisplayWidth = 200;
ColumnCount = 3;
}

public int DisplayWidth;
public int ColumnCount;
public string FolderName;
}

public class PictureViewerHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
PictureViewerInfo info = GetFolderInfo(context);
string html = CreateOutput(info);

//Output the data
context.Response.Write("<html><head><title>");
context.Response.Write("Picture Web Viewer");
context.Response.Write("</title></head><body>");
context.Response.Write(html);
context.Response.Write("</body></html>");
}

public bool IsReusable
{
get { return true; }
}
...
}

  為擷取實際的路徑,只需從URL中去除“folder.axd”字串及所有斜杠和反斜線。隨後,我們將檔案夾的URL映射到伺服器的路徑,通過.NET Framework進行處理。

private ArrayList GetAllImages(string path)
{
string[] fileTypes = { "*.bmp", "*.gif", "*.jpg", "*.png" );
ArrayList Images = new ArrayList();
DiectoryInfo di = new DirectoryInfo(path);
foreach(string ext in fileTypes)
{
FileInfo[] files = di.GetFiles(ext);
if(files.Length > 0)
images.AddRange(files);
}
return images;
}

  輸出圖片預覽:

string CreateOutputForFolder(PictureViewerInfo info)
{
ArrayList images = GetAllImages(info.FolderName);
Table t = new Table();

int index = 0;
bool moreImages = true;
while(moreImages)
{
TableRow row = new TableRow();
t.Rows.Add(row);
for(int i = 0; i < info.ColumnCount; i++)
{
TableCell cell = new TableCell();
row.Cells.Add(cell);

//Create the image
Image img = new Image();
FileInfo fi = (FileInfo)images[index];
img.ImageUrl = filName;
img.Width = Unit.Pixel(info.DisplayWidth);

//Wrap the image in an anchor so tha a larger image is
//shown when the user clicks
HtmlAnchor a = new HtmlAnchor();
a.Href = new HtmlAnchor(); a.Controls.Add(img);
cell.Controls.Add(a);

//Check whether there are more images to show
index++;
moreImages = (index < images.Count);
if(!moreImage)
break;
}
}    string html = Utils.RenderControlAsString(t);
    return html;
}

  我們可使該處理常式接受一些可選的查詢字串參數(像寬度和列數)。下面是處理URL查詢字串的過程:

PictureViewerInfo info = new PictureViewInfo();
object p1 = context.Request.Params["Width"];
object p1 = context.Request.Params[""];

  下面是處理URL查詢字串的過程:

PictureViewerInfo = new PictureViewerINfo();
object p1 = context.request.Params["Width"];
object p2 = context.request.Params["Cols"];
if(p1 != null)
Int32.TryParse((string)p1, out info.DisplayWidth);
if(p1 != null)
Int32.TryParse((string)p2, out info.ColumnCount);

  該處理常式的註冊非常簡單,將以下指令碼添加到web.config即可:

<add verb="*" path="folder.axd" type="Core35.Components.PictureViewerHandler, Core35Lib" />

  將產生的程式集置於GAC中,並將這段指令碼插入到全域的web.config中,那麼當前電腦中所有的應用程式都可共用該功能了。

  使用樣本:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.