Как вернуть ActionResult (файл) из класса, который не является производным от контроллера? - PullRequest
0 голосов
/ 12 февраля 2019

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

Как я могувозврат из класса, который не является производным от Controller файла с этим простым в работе методом из Mvc.ControllerBase.File?

public (bool Success, string ErrorMessage, IActionResult File) TryDownloadFile(string FilePath, string FriendlyName)
{
    try
    {
        var bytes = File.ReadAllBytes(FilePath);

        if (FilePath.EndsWith(".pdf"))
        {
            return (true, "", new FileContentResult(bytes, "application/pdf"));
        }
        else
        {
            return (true, "", ControllerBase.File(bytes, "application/octet-stream", FriendlyName));
        }
    }
    catch (Exception ex)
    {
        return (false, ex.Message, null); 
    }
}

Ошибка:

Ссылка на объекттребуется для нестатического поля, метода или свойства 'ControllerBase.File (Stream, string, string)'

для этой строки:

return (true, "", ControllerBase.File(bytes, "application/octet-stream", FriendlyName));

Есть ливозможность этого достичь?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Если вы видите, что делает ControllerBase, вы можете повторить это: https://github.com/aspnet/AspNetCore/blob/c1bc210e8ebb6402ac74f4705d5748bc8e3ee544/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs#L1120.

public virtual FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName)
    => new FileContentResult(fileContents, contentType) { FileDownloadName = fileDownloadName };

Так что создайте FileContentResult со своими параметрами и верните его из действия.

0 голосов
/ 12 февраля 2019

ControllerBase.File - это просто удобный метод, который создает для вас экземпляр FileContentResult.Вот фактический код , который используется:

new FileContentResult(fileContents, contentType) { FileDownloadName = fileDownloadName };

Вы можете просто взять этот код и использовать его в своем классе, например:

return (
    true,
    "",
    new FileContentResult(bytes, "application/octet-stream") { FileDownloadName = FriendlyName });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...