В чем разница между File(), PhysicalFile(), PhysicalFileResult() в ASP.NET Core?

Я пытаюсь создать конечную точку веб-API с использованием ядра ASP.NET 3.1, что позволит приложению отправить мне идентификатор, и ответ будет с соответствующим файлом.

Вот мой метод

[HttpGet("get")]
public IActionResult Get(Guid id)
{
    FoundFileInfo file = PathFinder.Get(id);

    if(file == null || !System.IO.File.Exists(file.Fullname))
    {
        return NotFound();
    }

    return File(file.Fullname, "image/jpeg");
}

используя тот же код, я могу вернуть File(file.VirtualName, "image/jpeg"), new PhysicalFileResult(filename, "image/jpeg") или PhysicalFile(filename, "image/jpeg"). Но в чем разница между ними и каков правильный вариант использования для каждого из них?

Моя конечная цель — позволить потребителю создать экземпляр IFileInfo из ответа моей конечной точки. Каким-то образом я хотел бы предоставить потребителю достаточно информации, такой как LastModified, Length, Name, PhysicalPath. Какой метод является правильным методом для использования в моем случае?


person Community    schedule 31.12.2019    source источник
comment
Не существует существующих функций, которые будут возвращать файл со всеми его метаданными так, как вы запрашиваете. Вам нужно будет написать что-то, что возвращает метаданные вместе с данными самого файла, используя JSON или какой-либо другой формат. Ваш клиент должен будет иметь возможность анализировать эти метаданные и данные, чтобы создать FileInfo самостоятельно.   -  person Heretic Monkey    schedule 31.12.2019


Ответы (1)


File< .NET Core /a> обрабатывает только виртуальные пути (относительно вашего веб-сайта). PhysicalFile обрабатывает физические (абсолютные) пути к файлам.

PhysicalFile — это просто фасад, который возвращает PhysicalFileResult. Но вы можете просто вернуть его вручную с помощью new PhysicalFileResult.

Я не думаю, что есть другие различия, выбор в основном зависит от того, как вы можете получить местоположение файла, который хотите вернуть. Если у вас есть и виртуальное, и физическое местоположение, вы можете выбрать любое из двух (File или PhysicalFile).

person Wiktor Zychla    schedule 31.12.2019
comment
Согласно документам варианты PhysicalFile могут быть более эффективными с помощью using mechanisms provided by the host., что означает TransmitFile в Windows и sendfile на Линукс. - person Eric Mutta; 07.01.2021