c# - 流式传输大型 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 设置,相同的代码在另一个项目上运行良好(我一定遗漏了一些东西)。有任何想法吗?
解决方案
推荐阅读
- apache-spark - Spark 结构化流式处理 Kafka 微批量计数
- c - 寻找 C w/openssl 等效于 java bouncycastle SHA256withRSA 签名
- python - Python icalendar 无法识别密钥
- azure - 无法使用 Azure Fluent 获取存储帐户密钥
- java - 使用 BrokeredMessage 消息在 Java 中使用 Azure 队列消息。getBody() 返回一些头信息,如何摆脱它?
- keras - Keras:使用铰链或分类铰链实现 SVM?
- python - 保留第一个非零元素,将所有其他元素设置为 0
- r - ggplot绘制多个条形图
- javascript - 从 html 按钮执行 api 调用...如何
- javascript - Chrome extensions get information from the webpage