How to delete a file after it was streamed in ASP.NET Core(如何在 ASP.NET Core 中流式传输文件后删除文件)
问题描述
我想在返回表单操作后删除一个临时文件.我如何使用 ASP.NET Core 实现这一点:
I would like to delete a temporary file after returning it form action. How can i achieve that with ASP.NET Core:
public IActionResult Download(long id)
{
var file = "C:/temp/tempfile.zip";
var fileName = "file.zip;
return this.PhysicalFile(file, "application/zip", fileName);
// I Would like to have File.Delete(file) here !!
}
文件太大,无法使用内存流返回.
The file is too big for returning using memory stream.
推荐答案
File() 或 PhysicalFile() 返回一个 FileResult 派生类,它只是 委托处理给一个执行服务.PhysicalFileResult 的 ExecuteResultAsync 方法调用:
File() or PhysicalFile() return a FileResult-derived class that just delegates processing to an executor service. PhysicalFileResult's ExecuteResultAsync method calls :
var executor = context.HttpContext.RequestServices
.GetRequiredService<IActionResultExecutor<PhysicalFileResult>>();
return executor.ExecuteAsync(context, this);
所有其他基于 FileResult 的类都以类似的方式工作.
All other FileResult-based classes work in a similar way.
PhysicalFileResultExecutor 类本质上是将文件的内容写入响应流.
The PhysicalFileResultExecutor class essentially writes the file's contents to the Response stream.
一个快速而肮脏的解决方案是创建您自己的基于 PhysicalFileResult 的类,该类委托给 PhysicalFileResultExecutor,但在执行程序完成后删除文件:
A quick and dirty solution would be to create your own PhysicalFileResult-based class that delegates to PhysicalFileResultExecutor but deletes the file once the executor finishes :
public class TempPhysicalFileResult : PhysicalFileResult
{
public TempPhysicalFileResult(string fileName, string contentType)
: base(fileName, contentType) { }
public TempPhysicalFileResult(string fileName, MediaTypeHeaderValue contentType)
: base(fileName, contentType) { }
public override async Task ExecuteResultAsync(ActionContext context)
{
try {
await base.ExecuteResultAsync(context);
}
finally {
File.Delete(FileName);
}
}
}
您可以创建并返回 TempPhysicalFileResult,而不是调用 PhysicalFile() 来创建 PhysicalFileResult,例如:
Instead of calling PhysicalFile() to create the PhysicalFileResult you can create and return a TempPhysicalFileResult, eg :
return new TempPhysicalFileResult(file, "application/zip"){FileDownloadName=fileName};
同样的事情 PhysicalFile() 会:
[NonAction]
public virtual PhysicalFileResult PhysicalFile(
string physicalPath,
string contentType,
string fileDownloadName)
=> new PhysicalFileResult(physicalPath, contentType) { FileDownloadName = fileDownloadName };
更复杂的解决方案是创建一个自定义执行器,该执行器负责压缩和清理文件等工作,让操作代码清除结果格式代码
A more sophisticated solution would be to create a custom executor that took care eg of compression as well as cleaning up files, leaving the action code clean of result formatting code
这篇关于如何在 ASP.NET Core 中流式传输文件后删除文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在 ASP.NET Core 中流式传输文件后删除文件
- Windows 喜欢在 LINUX 中使用 MONO 进行服务开发? 2022-01-01
- 带问号的 nvarchar 列结果 2022-01-01
- 是否可以在 .Net 3.5 中进行通用控件? 2022-01-01
- 为什么 C# 中的堆栈大小正好是 1 MB? 2022-01-01
- Azure Active Directory 与 MVC,客户端和资源标识同一 2022-01-01
- 在 LINQ to SQL 中使用 contains() 2022-01-01
- 在 C# 中异步处理项目队列 2022-01-01
- CanBeNull和ReSharper-将其用于异步任务? 2022-01-01
- 使用 rss + c# 2022-01-01
- C# 通过连接字符串检索正确的 DbConnection 对象 2022-01-01
