ASP.NET Core 中的 File()、PhysicalFile()、PhysicalFileResult() 有啥区别?

Posted

技术标签:

【中文标题】ASP.NET Core 中的 File()、PhysicalFile()、PhysicalFileResult() 有啥区别?【英文标题】:What is the difference between File(), PhysicalFile(), PhysicalFileResult() in ASP.NET Core?ASP.NET Core 中的 File()、PhysicalFile()、PhysicalFileResult() 有什么区别? 【发布时间】:2020-04-20 02:36:21 【问题描述】:

我正在尝试使用 ASP.NET core 3.1 构建一个 Web API 端点,这将允许应用程序向我发送一个 id,并且响应将包含相应的文件。

这是我的方法

[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 的实例。不知何故,我想给消费者足够的信息,比如LastModifiedLengthNamePhysicalPath。哪种方法适合我的情况?

【问题讨论】:

没有现有的函数可以按照您请求的方式返回包含所有元数据的文件。您必须使用 JSON 或其他格式编写返回元数据以及文件数据本身的内容。您的客户需要能够解析元数据和数据以自己构建FileInfo 【参考方案1】:

.NET Core 的 File 仅处理虚拟路径(相对于您的网站)。 PhysicalFile 处理物理(绝对)文件路径。

PhysicalFile 只是一个返回PhysicalFileResult 的外观。但是您可以使用new PhysicalFileResult 手动返回它。

我认为没有其他区别,选择主要取决于您如何获得要返回的文件的位置。如果您同时拥有虚拟和物理位置,则可以选择两者中的任何一个(FilePhysicalFile)。

【讨论】:

根据docs,PhysicalFile 变体可以通过using mechanisms provided by the host. 更有效,这意味着TransmitFile 在Windows 上和sendfile 在Linux 上。

以上是关于ASP.NET Core 中的 File()、PhysicalFile()、PhysicalFileResult() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core Web API 如何返回 File。

如何将文件中的其他参数从 Angular 传递给 ASP.NET Core 控制器?

理解ASP.NET Core

如何在 asp.net core 中上传文件?

ASP.NET Core ---- 系列文章

ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存