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 的实例。不知何故,我想给消费者足够的信息,比如LastModified
、Length
、Name
、PhysicalPath
。哪种方法适合我的情况?
【问题讨论】:
没有现有的函数可以按照您请求的方式返回包含所有元数据的文件。您必须使用 JSON 或其他格式编写返回元数据以及文件数据本身的内容。您的客户需要能够解析元数据和数据以自己构建FileInfo
。
【参考方案1】:
.NET Core 的 File
仅处理虚拟路径(相对于您的网站)。 PhysicalFile
处理物理(绝对)文件路径。
PhysicalFile
只是一个返回PhysicalFileResult
的外观。但是您可以使用new PhysicalFileResult
手动返回它。
我认为没有其他区别,选择主要取决于您如何获得要返回的文件的位置。如果您同时拥有虚拟和物理位置,则可以选择两者中的任何一个(File
或 PhysicalFile
)。
【讨论】:
根据docs,PhysicalFile
变体可以通过using mechanisms provided by the host.
更有效,这意味着TransmitFile 在Windows 上和sendfile 在Linux 上。以上是关于ASP.NET Core 中的 File()、PhysicalFile()、PhysicalFileResult() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net Core Web API 如何返回 File。