Книга: ASP.NET MVC Framework
FileResult
FileResult
Очень часто в ответ на запрос пользователя требуется вернуть не HTML-страницу или данные в формате JSON, а какой-нибудь бинарный файл. FileResult
— это механизм, который как раз и позволяет возвратить файл как результат работы действия контроллера.
У FileResult
есть два важных свойства, которые требуется указывать при возвращении результата действия:
? contentType
— свойство, которое задается через конструктор класса FileResult
и не может быть изменено напрямую. ContentType
указывает MIME-тип содержимого передаваемого файла;
? FileDownloadName
— свойство, указывающее на файл, который требуется передать в ответ на запрос.
Рассмотрим использование FileResult
на следующем примере. Пусть нам требуется на пользовательский запрос возвращать сопоставленный с пользователем рисунок. Реализуем эту возможность с помощью файловой системы. Для этого создадим в корне проекта папку Admin
, в которой будем хранить рисунки пользователей в формате PNG с именем вида: GUID пользователя.рng. Действие GetUserImage
контроллера AdminController
, которое будет возвращать изображение с помощью FileResult
, представлено в следующем фрагменте:
public ActionResult GetUserImage(string userName)
{
if (string.IsNullOrEmpty(userName))
throw new HttpException(404, "Пользователь не найден");
MembershipProvider mp = Membership.Provider;
MembershipUser user = mp.GetUser(userName, false);
if (user == null)
throw new HttpException(404, "Пользователь не найден");
string userGuidString = ((Guid) user.ProviderUserKey).ToString();
string fileName = userGuidString + ".png";
return File(fileName, "image/png");
}
Обратите внимание, что для возвращения результата типа FileResult
в примере используется стандартный метод контроллера File
, который упрощает возврат результата в виде FileResult
. Методу File
передается два параметра: путь к возвращаемому файлу и его MIME-тип, который в данном случае для PNG-файла равен image/png.
В MVC Framework существует еще один класс для работы с файлами — класс FileContentResult
, который наследует от FileResult
и позволяет возвращать данные не на основании пути к файлу, а с помощью существующего потока данных, который может генерироваться в самом действии.