ASP .NET Core
MVC控制器 - 使用FileStream从服务器存储下载文件,并返回FileStreamResult
public IActionResult Download(string path, string fileName)
{
var fileStream = System.IO.File.OpenRead(path);
return File(fileStream, "application/force-download", fileName);
}
一切正常,但是如果用户在下载完成之前取消了下载,那么控制器中与该文件相关的其他操作 (删除文件、重命名文件) 将无法工作,因为:进程无法访问该文件,因为它正在被另一个进程使用
当文件下载完成时,FileStream会自动释放,但由于某些原因,当用户手动终止下载时,它并不会终止。
我不得不重新启动Web应用程序 => 使用该文件的程序是IISExpress
请问是否有人知道如何在用户手动结束下载时释放流?
编辑:
FileStream stream = null;
try
{
using (stream = System.IO.File.OpenRead(path))
{
return File(stream, "application/force-download", fileName);
}
}
我试图在返回FileStreamResult后结束流,但我知道这是行不通的,因为在return File (stream, contentType, fileName)
之后它立即跳转到finally块并且流被关闭,所以下载不会开始。
using
块内。 - Anand Sowmithiranreturn File(System.IO.File.ReadAllBytes(path), "...
这样做吗?或者更好的是,使用CancellationToken
操作参数,并将其传递给var bytes = await File.ReadAllBytesAsync(path, token);
。 - JHBonariusController.File
的构造函数接受一个Stream
,将生成一个FileStreamResult
。如果您不知道自己在说什么,请不要建议任何东西。 - JHBonariusOperationCancelledException
),你需要尝试一些方法。不幸的是,我没有办法测试你的代码,所以很难给出具体的解决方案。从我所见,我认为你可以做到,同时进行一些研究也不会有坏处。我确信某个地方的某个人也面临类似的问题,虽然我无法提供确定的解决方案,但我会给你 10 分的好问题奖励... - anastaciu