Asp*_*ian 28 c# file-io large-file-upload asp.net-core asp.net-core-webapi
我正在使用干净的架构开发 ASP.NET Core 3.1 API 项目,并且我有以下类库(层):
我希望能够将大文件上传到服务器(例如 2Gb 的文件大小甚至更大)并在此之后下载它们,并且希望在将来不会出现内存溢出和所有问题的情况下进行下载。
任何帮助,将不胜感激。
Com*_*Guy 61
如果你有这么大的文件,千万不要在你的代码中使用byte[]
或MemoryStream
。如果您下载/上传文件,则仅对流进行操作。
你有几个选择:
StreamContent
该类发送它们。同样,不要使用 aMemoryStream
作为源,而是使用其他类似FileStream
.var response = await httpClient.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead)
. 否则,HttpClient 会将整个响应缓存在内存中。然后,您可以通过 将响应文件作为流处理var stream = response.Content.ReadAsStreamAsync()
。ASP.NET Core 具体建议:
[RequestSizeLimit(10L * 1024L * 1024L * 1024L)]
和[RequestFormLimits(MultipartBodyLengthLimit = 10L * 1024L * 1024L * 1024L)]
. 另外需要关闭表单值绑定,否则整个请求都会被缓存到内存中: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
var factories = context.ValueProviderFactories;
factories.RemoveType<FormValueProviderFactory>();
factories.RemoveType<FormFileValueProviderFactory>();
factories.RemoveType<JQueryFormValueProviderFactory>();
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
}
Run Code Online (Sandbox Code Playgroud)
File
接受流的方法返回它:return File(stream, mimeType, fileName);
示例控制器如下所示(有关缺少的帮助程序类,请参阅https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1):
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
var factories = context.ValueProviderFactories;
factories.RemoveType<FormValueProviderFactory>();
factories.RemoveType<FormFileValueProviderFactory>();
factories.RemoveType<JQueryFormValueProviderFactory>();
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,我们将整个文件流式传输到另一个服务。在某些情况下,最好将文件临时保存到磁盘。
归档时间: |
|
查看次数: |
25636 次 |
最近记录: |