C# 小技巧 - 不必再靠 switch case 副檔名決定 ContentType 囉

由 ASP.NET 伺服器端傳回檔案內容,需指定適當的 ContentType,瀏覽器才會將其視為圖檔、HTML、CSS 或 JavaScript 處理。過去我都是土法煉鋼,取得副檔名再用 switch … case 針對已知檔案種類列舉對應 ContentType,像這樣:

string contentType = "";
switch (fileName.Split('.').Last())
{
    case "jpg":
        contentType="image/jpeg";
        break;
    case "gif":
        contentType="image/gif";
        break;
    case "png":
        contentType="image/png";
        break;
    case "htm":
        contentType="text/html";
        break;
    case "css":
        contentType="text/css";
        break;
    case "js":
        contentType="text/javascript";
        break;
    default:
        throw new ApplicationException("Not supperted file type!");
}

隨便搜尋我的舊文章就能找到應用案例: 淺嚐Data URIHTML5 Canvas的Origin-Clean安全原則

最近發現好東西,.NET 4.5 起 System.Web 內建的 MimeMapping.GetMimeMapping() 可以直接將檔名(注意: 是檔名不是副檔名)對應成 ContentType,不用再自己徒手硬刻:

所以,文章開頭的程式邏輯可以簡化成:

if (!"jpg,gif,png,htm,css,js".Split(',').Contains(fileName.Split('.').Last())
    throw new ApplicationException("Not supperted file type!");
var contentType=MimeMapping.GetMimeMapping(fileName);

順便補充,從 ASP.NET WebForm 傳回 jpg、png 等圖檔,ContentType 已指定為 image/jpeg、image/png,若希望瀏覽器不要直接顯示而是下載另存檔案,可透過 Content-Disposition Header 搞定:
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + Server.UrlEncode(fileName) + "\"");
如果是 ASP.NET MVC Action,直接使用 return File(byteArray, contentType, fileName),MVC 會在背後搞定 ContentType 及 ContentDisposition Header,是最省事的做法。

延伸閱讀:

歡迎推文分享:
Published 09 December 2017 10:36 AM 由 Jeffrey
Filed under: , ,
Views: 8,225



意見

# demo said on 08 December, 2017 11:05 PM

MVC 的強制下載應該是可以很簡單的使用

return File(fileContents,contentType,fileDownloadName)

有給 file download name 即可

# Jeffrey said on 09 December, 2017 04:39 AM

to demo, 對,我熊熊忘記了。已補充於本文,感謝提醒。

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<December 2017>
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication