1

如何在 asp.net 核心中将应用程序服务与IFormFile分离而无需流复制开销。

    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 分离。例如在 UploadAsync 方法中传递 IFormFile 流指针和复制流的任何方式。谢谢。

4

1 回答 1

1

按照ramin的想法。

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);
    }
}

然后创建代理模型并将其传递给上传服务。

谢谢大家。

于 2020-06-30T05:23:52.833 回答