Разница между FileContentResult и FileStreamResult

Я редактирую код, и есть один метод, возвращающий тип FileContentResult. Я получаю поток от службы, поэтому для меня было бы удобнее изменить возвращаемый тип на FileStreamResult.

Должен ли я преобразовать поток в массив для возврата FileContentResult?

Или я могу просто изменить возвращаемый тип безопасно?

Ответ 1

FileResult является абстрактным базовым классом для всех остальных.

  • FileContentResult - используйте его, когда у вас есть массив байтов, который вы бы как вернуться в файл
  • FileStreamResult - у вас открыт поток, вы хотите вернуть его содержимое как файл

Ответ 2

Оба FileStreamResult и FileContentResult наследуют от FileResult, который наследует от ActionResult. Таким образом, вы можете вернуть один тип из метода, который имеет ActionResult в качестве типа возврата

Если у вас уже есть поток ,, вы можете использовать конструктор FileStreamResult для возврата FileResult

public ActionResult Download()
{
    var f = Server.MapPath("~/Content/mypdf.pdf");
    var fileStream = new FileStream(f,FileMode.Open,FileAccess.Read);
    return new FileStreamResult(fileStream, MimeMapping.GetMimeMapping(f));
}

Если у вас уже есть byte arrray, вы можете использовать конструктор FileContentResult для возврата FileResult

public ActionResult Download()
{
    var f = Server.MapPath("~/Content/mypdf.pdf");
    var bytes = System.IO.File.ReadAllBytes(f);
    return new FileContentResult(bytes, MimeMapping.GetMimeMapping(f));
}

Метод Controller.File имеет перегрузки, которые принимают либо массив байтов, либо поток

public ActionResult Download()
{
    var f = Server.MapPath("~/Content/mypdf.pdf");
    var bytes = System.IO.File.ReadAllBytes(f);
    return File(bytes, MimeMapping.GetMimeMapping(f));
}
public ActionResult Download2()
{
    var f = Server.MapPath("~/Content/mypdf.pdf");
    var fileStream = new FileStream(f, FileMode.Open, FileAccess.Read);
    return File(fileStream, MimeMapping.GetMimeMapping(f));
}

Если браузер имеет поддержку для отображения типа содержимого ответа, ответ будет отображаться в браузере. Например, для вышеуказанного кода он отобразит pdf-контент в браузере.

Существует еще одна перегрузка метода File, который берет имя файла загрузки, которое будет использовать диалог сохранения/загрузки браузеров, чтобы пользователь мог сохранить его локальный компьютер и/или открыть.

public ActionResult Download4()
{
    var f = Server.MapPath("~/Content/mypdf.pdf");
    var fileStream = new FileStream(f, FileMode.Open, FileAccess.Read);
    return File(fileStream, MimeMapping.GetMimeMapping(f),"MyfileNiceFileName.pdf");
}

При этом пользователь получит приглашение для загрузки из браузера.