在 ASP.Net Core 中,推荐的返回文件的方法是通过 PhysicalFileProvider
获得访问权限,这提供了额外的安全性,包括将所有路径的范围限定到一个目录及其子目录。目前我的整个应用程序都是异步的,我希望我的所有方法都保持这种状态。
public static string BASE_PATH = Path.GetTempPath();
public static string lastSavedFilePath = @"C:\Users\MyUser\AppData\Local\Temp\MyPicture.png"
[HttpGet("{id}")]
public async Task<FileResult> GetFileById(int id)
{
//provides access to the physical file system, scoping all paths to a directory and its children
IFileProvider provider = new PhysicalFileProvider(BASE_PATH);
var fileInfo = provider.GetFileInfo(lastSavedFilePath);
var fileStream = fileInfo.CreateReadStream();
this._contentTypeProvider.TryGetContentType(lastSavedFilePath, out var mimeType);
return File(fileStream, mimeType, "ProfilePicture.png");
}
编辑
原来通过PhysicalFileProvider
获取文件并不是我想要异步的,我真的希望Stream是异步读取的。
我如何确保在调用我的文件操作时它会异步读取我的流?
最佳答案
PhysicalFileProvider
完全能够异步读取文件。 GetFileInfo
返回有关文件的信息,这里没有什么应该异步完成的。它类似于 new FileInfo("path")
。
CreateReadStream
获取目标文件句柄,类似于File.OpenRead()
。再次声明 - 这里不应该是异步的,也不是您是否使用 PhysicalFileProvider
。
当你有文件流时 - 你可以像往常一样异步读取它(ReadAsync
等等),不管你是如何获得它的。事实上,PhysicalFileProvider.CreateReadStream
甚至可以使用正确的标志 (FileOptions.Asynchronous
) 打开文件,使该流非常适合异步访问(而不适合非异步访问)。
在您的情况下,您不需要自己读取该文件流。你用
正确地返回它return File(fileStream, mimeType, "ProfilePicture.png");
这已经为您异步读取该文件并将其写入 http 响应流。这是因为所有 ActionResult
,包括您返回的 FileStreamResult
,都有 Task ExecuteAsync
方法来实际执行该结果。 Asp.net 将为您执行 await yourFileResult.ExecuteAsync()
,ExecuteAsync
会将文件流异步复制到 http 响应。
所以简而言之 - 只需签名
public FileResult GetFileById(int id)
你会没事的。应该异步完成的已经在这段代码中异步完成了。
关于c# - .Net Core 异步文件结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630173/