今天给大家推荐一款开源的适用于.Net的高性能文件上项目UploadStream。
背景
流式多部分文件上传是指将文件分成多个部分,然后逐个部分上传到服务器。这种方式可以减少内存使用,提高上传性能,尤其是在上传大型文件时。
由于微软官方推荐的流式多部分文件上传代码比较复杂,作者对微软官方推荐的流式多部分文件上传代码进行了简化和重写,使其更容易理解和使用。
微软文档地址:
https://learn.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1
项目性能结果的报告地址:
https://medium.com/@ma1f/file-streaming-performance-in-dotnet-4dee608dd953
特点
优化多部分流式文件上传性能,提供 10 倍性能提升和 10%-40% 内存分配减少。
默认情况下,.Net模型表单模型绑定使用IEnumerable<IFormFile>
将整个流加载到内存中。这对大型文件来说并不理想,因为流的处理应该在流式传输过程中发生,而不是将整个文件(s) 缓冲到内存/磁盘中。
该软件包允许通过委托异步处理上传流(StreamFiles<T>(Action<IFormFile> func)
),同时保持通用的模型绑定功能和验证。
简而言之,该软件包可以显著提高大型文件上传的性能和内存效率。
使用方法
安装包
代码语言:javascript复制> install-package UploadStream
定义一个UploadModel
代码语言:javascript复制public class UploadModel
{
public string Name { get; set; }
public string Description { get; set; }
public List<IFormFile> Files { get; set; }
}
使用UploadStream
代码语言:javascript复制[HttpPost("upload")]
public async Task<IActionResult> Upload(UploadModel model)
{
byte[] buffer = new byte[4096];
foreach (var s in model.Files)
using (var stream = s.OpenReadStream())
while (await stream.ReadAsync(buffer, 0, buffer.Length) > 0) ;
return Ok(new
{
model.Name,
model.Description,
files = model.Files.Select(x => new {
x.Name,
x.FileName,
x.ContentDisposition,
x.ContentType,
x.Length
})
});
}
资源获取方式
https://github.com/ma1f/uploadstream