Jen*_*nsB 5 c# asp.net-core asp.net-core-3.0
我有这个方法。
[HttpGet("view/{fileId}/{width}/{height}/{name}")]
public async Task<FileStreamResult> View(Guid fileId, int width, int height, string name)
{
var fileInfo = await _fileViewer.GetImageInfo(fileId, width, height);
FileStream f = new FileStream(fileInfo.FilePath, FileMode.Open);
return File(f, fileInfo.MimeType);
}
Run Code Online (Sandbox Code Playgroud)
它只是将调整后的图像返回到浏览器。有用。但据我所知它会泄漏内存。
FileStream f永远不会被处置。
我可以看到我的服务器内存正在慢慢耗尽。
如果我using在其中添加一条语句,则会收到流已关闭的错误,即 using 语句在文件返回给用户之前关闭。
这应该如何正确完成?
更新1。这:
using (FileStream f = new FileStream(fileInfo.FilePath, FileMode.Open))
{
return File(f, fileInfo.MimeType);
}
Run Code Online (Sandbox Code Playgroud)
产量
System.ObjectDisposeException:无法访问已处置的对象。对象名称:“无法访问已关闭的文件。”。
我建议您使用 Asp.net Core 文件提供程序,而不是使用 system.IO 手动读取文件。 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/file-providers?view=aspnetcore-3.1
但是如果您不想使用依赖注入并将 fileProvider 注入到控制器中,那么这个技巧应该适合您:
var fileInfo = await _fileViewer.GetImageInfo(fileId, width, height);
var fileName = Path.GetFileName(fileInfo.FilePath);
IFileProvider x = new PhysicalFileProvider(Path.GetDirectoryName(fileInfo.FilePath));
IFileInfo fi = x.GetFileInfo(fileName);
// you can use your mime type as second argumant. (fileInfo.MimeType)
return File(fi.CreateReadStream(), MediaTypeNames.Application.Octet , fileName);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1134 次 |
| 最近记录: |