首页 > 解决方案 > 流式传输大型 ISO 文件 ASP.Net Core

问题描述

我正在尝试流式传输大型 iso 文件(~4Gb)。因此,我关注了这篇文章https://dotnetcoretutorials.com/2017/03/12/uploading-files-asp-net-core/(流式文件(大文件)是我感兴趣的部分)。我的控制器看起来像这样:

        [HttpPost]
        [DisableFormValueModelBinding]
        [Authorize]
        [RequestFormLimits(MultipartBodyLengthLimit = 5368709000)]
        [RequestSizeLimit(5368709000)]
        [Route("{clusterId}/image_library/upload_image")]
        [ProducesResponseType(typeof(AsyncOperationResult), 200)]
        [ProducesResponseType(typeof(OperationResult), 400)]
        [ProducesResponseType(typeof(string), 401)]
        public IActionResult UploadFile()
        {
            bool result = Request.StreamFile("E:\\").Result; / extension method

            if (result)
            {
                return Ok();
            }

            return BadRequest();
            bool result=  Request.StreamFile("E:\\").Result; /extension method

            if (result)
            {
                return Ok();
            }

            return BadRequest();
        }

DisableFormValueModelBinding 属性实现如下:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            var formValueProviderFactory = context.ValueProviderFactories
                .OfType<FormValueProviderFactory>()
                .FirstOrDefault();
            if (formValueProviderFactory != null)
            {
                context.ValueProviderFactories.Remove(formValueProviderFactory);
            }

            var jqueryFormValueProviderFactory = context.ValueProviderFactories
                .OfType<JQueryFormValueProviderFactory>()
                .FirstOrDefault();
            if (jqueryFormValueProviderFactory != null)
            {
                context.ValueProviderFactories.Remove(jqueryFormValueProviderFactory);
            }
        }

        public void OnResourceExecuted(ResourceExecutedContext context)
        {
        }
    }

我的 Kestrel 是这样配置的:

hostBuilder.UseKestrel(options =>
                {
                    options.AddServerHeader = false;
                    options.Listen(ipAddress, ProviderSettings.API_port);
                    options.Listen(ipAddress, ProviderSettings.API_SSL_port, listenOptions =>
                    {
                        listenOptions.UseHttps(sslSert);
                    });
                    options.Limits.MaxRequestBodySize = null;
                })
                .UseContentRoot(contentRootPath)
                .ConfigureLogging(logging =>
                {
                    // Remove default Microsoft Logger
                    logging.ClearProviders();
                });

问题是,当我在我的控制器方法上发布文件时,它们被加载到 RAM 中,但我需要它们在不占用我的 RAM 的情况下通过 butches 在 hardrive 上流式传输。

检查了我的中间件:没有重新配置 Kestrel 设置,相同的代码在另一个项目上运行良好(我一定遗漏了一些东西)。有任何想法吗?

标签: c#asp.net-corestreamingmultipartform-data

解决方案


推荐阅读