Отправка файлов в ASP.NET MVC 5

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Для отправки клиенту файлов предназначен FileResult. Однако так как это абстрактный класс, то фактически мы будем иметь дело с его наследниками:

  • FileContentResult: отправляет клиенту массив байтов, считанный из файла

  • FilePathResult: представляет простую отправку файла напрямую с сервера

  • FileStreamResult: данный класс создает поток - объект System.IO.Stream, с помощью которого считывает и отправляет файл клиенту

Во всех трех случаях для отправки файлов применяется метод File, который и возвращает объект FileResult. Только в зависимости от выбранного способа используется соответствующая перегруженная версия этого метода.

Чтобы отправить файл из файловой системы (то есть использование объекта FilePathResult), нам надо указать в методе File три параметра: путь к файлу на стороне сервера, тип содержимого и имя файла для принимающей стороны (имя файла необязательно, и можно обойтись в принципе только двумя параметрами).

public FileResult GetFile()
{
    // Путь к файлу
    string file_path = Server.MapPath("~/Files/PDFIcon.pdf");
    // Тип файла - content-type
    string file_type="application/pdf";
    // Имя файла - необязательно
    string file_name = "PDFIcon.pdf";
    return File(file_path,file_type,file_name);
}

Предполагается, что у нас в проекте есть папка Files, в которой лежит файл PDFIcon.pdf. Метод Server.MapPath позволяет построить полный путь к ресурсу из каталога в проекте. Но также можно использовать и абсолютные пути, обращаясь к любому файлу в файловой системе, например, string file_path = @"C:\Book\PDFIcon.pdf";

И, при обращении, например, по пути Home/GetFile нам будет предложено сохранить данный файл на локальном компьютере.

Похожим образом работает и классы FileContentResult, только вместо имени файла в методе File указывается массив байтов, в который был считан файл:

// Отправка массива байтов
public FileResult GetBytes()
{
    string path = Server.MapPath("~/Files/PDFIcon.pdf");
    byte[] mas = System.IO.File.ReadAllBytes(path);
    string file_type = "application/pdf";
    string file_name = "PDFIcon.pdf";
    return File(mas, file_type, file_name);
}

И если мы хотим возвратить объект FileStreamResult, то в качестве первого аргумента в методе File идет объект Stream для отправляемого файла:

// Отправка потока
public FileResult GetStream()
{
    string path = Server.MapPath("~/Files/PDFIcon.pdf");
	// Объект Stream
    FileStream fs = new FileStream(path, FileMode.Open);
    string file_type = "application/pdf";
    string file_name = "PDFIcon.pdf";
    return File(fs, file_type, file_name);
}
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850