Если вы разрабатывали приложения в ASP.NET MVC, то достаточно хорошо знакомы с классом ActionResult. ActionResult самый распространенный тип объектов возвращаемый действием. Когда разрабатывается MVC приложения, большую часть времени вы используете именно ActionResult класс.
На предыдущей неделе, я работал над своим open source проектом WeBlog, я создавал HTTP Handler для обработки изображений. Я начал использовать HTTP Handler для изображений, потому что нуждался в механизме предотвращения дополнительной нагрузке(hotlinking). Единственным минусом в использовании HTTP Handler - уродливые URL адреса. Вот пример, что у меня получалось:
/Image.axd?image=sample.png
К счастью, мой друг Рон рассказал мне, что я могу отказаться от HTTP Handler и использовать для этого метод действия контроллера, которое возвращает FileResult. После небольшого расследования, я понял, что Рон был абсолютно прав. Я удалил свой HTTP Handler и заменил его следующим кодом, который добавил в контроллер Home:
private string GetContentType(string filename) {
FileInfo file = new FileInfo(filename);
switch (file.Extension.ToUpper()) {
//images
case ".PNG" : return "image/png";
case ".JPG" : return "image/jpeg";
case ".JPEG": return "image/jpeg";
case ".GIF" : return "image/gif";
case ".BMP" : return "image/bmp";
case ".TIFF": return "image/tiff";
default:
throw new NotSupportedException("The Specified File Type Is Not Supported");
}
}
public FileResult GetImage(string id) {
string path = Path.Combine(Engine.GetImageDirectory().FullName, id);
return base.File(path, GetContentType( path ) );
}
Так как мой код проживает в контроллере Home, я должен использовать URL адреса следующего вида - “/Home/GetImage/sample.png” для отображения картинки. Предположительно, что данный URL может способствовать ошибкам, поэтому я решил использовать собственный маршрут. Новый маршрут назван “Images” и привязан к метода GetImaget контроллера Home. А вот вам и код для global.asax:
routes.MapRoute("Images",
"Images/{id}",
new { controller = "Home", action = "GetImage", id = "" });
Теперь я могу обращаться к изображениям следующим образом:
/Images/sample.png
Для пользователя это выглядит как традиционный путь к файлу. Тем не менее, не существует директории “Images” в корне проекта. “Images” является именем маршрута. Все изображения хранятся в папке App_Data/Images.
Используя объект FileResult в MVC вы получите не только красивые URL адреса, но и гибкость в расположении изображений. Вы можете хранить изображения в любом месте, где пожелаете, а URL никогда не изменится!
Источник - Michael Ceranski
2