无法在ASP.NET CORE 6 RAZOR页面中上传x>1GB的大文件

ifmq2ha2  于 2022-11-19  发布在  .NET
关注(0)|答案(3)|浏览(241)

我一直在寻找一种方法来上传一个大文件到我的服务器。我的表单工程小文件x〈30 MB。这是我的表单:

<div class="card">
     <div class="card-header">
         <center><b>Dodaj obrazek</b></center>
      </div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
 <div class="mb-3">
     <input type="file" asp-for="Gallery.Upload" class="form-control"  />
 </div>
 <button class="btn btn-success">Upload</button>
    </form>
    </div>
</div>

我正在使用IFormFile

[NotMapped]
    public IFormFile Upload { get; set; }

我已经尝试了很多场景,比如在SiteModel或Method之前声明RequestFormLimit:

[RequestFormLimits(MultipartBodyLengthLimit = 104857600)]
public class SiteModel : PageModel

    [RequestFormLimits(MultipartBodyLengthLimit = 104857600)]
    public async Task OnGetAsync()

但还是一无所获。
//UPDATE我已将此添加到我的Program.cs中

builder.Services.Configure<FormOptions>(conf =>
{
    conf.ValueLengthLimit = int.MaxValue;
    conf.MultipartBodyLengthLimit = int.MaxValue;
    conf.MemoryBufferThreshold = int.MaxValue;
});

并且在SiteModel之前

[DisableRequestSizeLimit]

而现在我只能上传最多100 MB,但我想让它更大,像4GB限制每一次上传。
如何更改限额大小?

bqjvbblv

bqjvbblv1#

在将一个旧的应用程序更新到.net6之后,我们遇到了同样的问题,并且也尝试了您所尝试过的所有方法。直到将web.config重新添加到项目中,才允许大规模上传成功。以下是所需的全部操作:

<?xml version="1.0" encoding="utf-8"?> <configuration>   
<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxAllowedContentLength="2147483648" />
        </requestFiltering>
    </security>                   
</system.webServer>

希望能有所帮助。

n8ghc7c1

n8ghc7c12#

对于.Net Core 6和Razor Pages,我们在Microsoft文档中提供了一些提示(https://learn.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-6.0
在Program.cs中,他们将文件限制作为一个选项包括在执行上载的页中:

// Add services to the container.
builder.Services.AddRazorPages(options => 
{
options.Conventions
    .AddPageApplicationModelConvention("/[your cshtml page name with no extension]",
        model =>
        {
            model.Filters.Add(
            new RequestFormLimitsAttribute()
            {
                // Set the limit to 256 MB
                ValueLengthLimit = 268435456,
                MultipartBodyLengthLimit = 268435456,
                MultipartHeadersLengthLimit = 268435456
            });
           // model.Filters.Add(
           //     new RequestSizeLimitAttribute(268435456));
        });
});

在文档中,他们只是添加了MultipartHeadersLengthLimit,但我还添加了其他限制,您也会有兴趣更改这些限制。
在页面模型中包括:

[DisableRequestSizeLimit]
[RequestFormLimits(MultipartBodyLengthLimit = 268435456)]
public class YourPageNameModel : PageModel
{ ...}

请注意,要遵循他们的示例,如果您尝试上载不同的扩展名,则必须使用正确的文件签名更新FileHelper.cs。否则,该页将返回无效状态。

y1aodyip

y1aodyip3#

这是一个安全+优化特性。默认情况下,每个有效负载可以移动的内容(数量和质量)有一个限制。对于this article的.net核心,它大约是25 MB。
根据您希望的托管方式,您可以更改此限制以适合您的情况。
您可以将web.config文件添加到项目中,并添加下面的代码。

<system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="209715200" />
        </requestFiltering>
      </security>
    </system.webServer>

您也可以遵循microsoft documentation(这是针对MVC的,但它很好用)。
这就足够了吗?不。由于TCP/IP和IEEE标准的网络结构,如果你没有一个开放的管道,传输大文件可以是一个苦差事没有良好的网络。它很容易中断。
我会建议你也尝试工作的压缩文件。这个教程压缩文件到一个Zip。

using(var compress = new GZipStream(outputFile, 
        CompressionMode.Compress, false)) 
 {
     byte[] b = new byte[inFile.Length];
     int read = inFile.Read(b, 0, b.Length);
     while (read > 0) 
     {
        compress.Write(b, 0, read);
        read = inFile.Read(b, 0, b.Length);
     }
 }.

如果你正在处理视频,但是,我会建议反对压缩到Zip或Rar.这是因为视频已经非常压缩.你可以然而“转置&变换”,这意味着你可以从一个Avi到一个Mkv的转换.有时,这个过程可能会丢失数据和质量.

相关问题