Разница между 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");
}
При этом пользователь получит приглашение для загрузки из браузера.