如何将应用程序服务与IFormFile分离,而无需在asp.net核心中进行流复制开销。
public interface IUploadService
{
Task UploadAsync(IFormFile file, CancellationToken cancellationToken = default);
}
[HttpPost]
public async Task<IActionResult> UploadFile([FromServices] IUploadService uploadService)
{
foreach(var file in Request.Form.Files)
{
await uploadService.UploadAsync(file);
}
return Ok();
}我需要将UploadAsync方法与IFormFile分离开来,因为应用程序服务层依赖于Microsoft.AspNetCore.Http.Features包,我应该删除它。一种解决方案是将IFormFile复制到文件流或内存流,并将流传递给UploadAsync方法。但是这种方式有流复制开销。我需要解决没有任何开销的解决方案,并将应用程序服务与IFormFile分离。例如,在IFormFile方法中传递UploadAsync流指针和复制流的任何方法。谢谢。
发布于 2020-06-30 05:23:52
根据拉明的想法。
public interface IFileStream
{
string Name { get; }
string FileName { get; }
string ContentType { get; }
long Length { get; }
Task CopyToAsync(Stream target, CancellationToken cancellationToken = default);
}
public interface IUploadService
{
Task UploadAsync(IFileStream file, CancellationToken cancellationToken = default);
}并在web项目中实现代理。
public class FormFileProxy : IFileStream
{
private readonly IFormFile file;
public FormFileProxy(IFormFile file)
{
this.file = file ?? throw new ArgumentNullException(nameof(file));
}
public string Name => file.Name;
public string FileName => file.FileName;
public string ContentType => file.ContentType;
public long Length => file.Length;
public async Task CopyToAsync(Stream target, CancellationToken cancellationToken = default)
{
await file.CopyToAsync(target, cancellationToken);
}
}然后创建代理模型并将其传递给上传服务。
多亏了所有人。
https://stackoverflow.com/questions/62634828
复制相似问题