Actuellement, je travaille avec Asp.Net Core et MVC6 et j'ai besoin de télécharger des fichiers de taille illimitée. J'ai cherché sa solution mais je n'ai toujours pas obtenu de réponse réelle.
Si quelqu'un a une idée, merci de l'aider.
Merci.
Actuellement, je travaille avec Asp.Net Core et MVC6 et j'ai besoin de télécharger des fichiers de taille illimitée. J'ai cherché sa solution mais je n'ai toujours pas obtenu de réponse réelle.
Si quelqu'un a une idée, merci de l'aider.
Merci.
Les autres réponses résolvent la restriction IIS . Cependant, à partir de ASP.NET Core 2.0, serveur Kestrel impose également ses propres limites par défaut.
Github de KestrelServerLimits.cs
Annonce de la limite de taille du corps de la demande et solution (citée ci-dessous)
Si vous souhaitez modifier la limite de taille maximale du corps de la requête pour une action ou un contrôleur MVC spécifique, vous pouvez utiliser la commande RequestSizeLimit
attribut. Le texte suivant permettrait MyAction
pour accepter des corps de requête jusqu'à 100 000 000 d'octets.
[HttpPost]
[RequestSizeLimit(100_000_000)]
public IActionResult MyAction([FromBody] MyViewModel data)
{
[DisableRequestSizeLimit]
peut être utilisé pour rendre la taille des requêtes illimitée. Cela rétablit effectivement le comportement pré-2.0.0 pour l'action ou le contrôleur attribué.
Si la demande n'est pas gérée par une action MVC, la limite peut toujours être modifiée pour chaque demande à l'aide de l'attribut IHttpMaxRequestBodySizeFeature
. Par exemple :
app.Run(async context =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = 100_000_000;
MaxRequestBodySize
est un long nullable. En lui attribuant la valeur null, on désactive la limite comme le fait MVC. [DisableRequestSizeLimit]
.
Vous ne pouvez configurer la limite sur une requête que si l'application n'a pas encore commencé la lecture, sinon une exception est levée. Il y a une IsReadOnly
qui vous indique si le MaxRequestBodySize
est en lecture seule, ce qui signifie qu'il est trop tard pour configurer la limite.
Si vous souhaitez modifier la taille maximale du corps de la demande de manière globale, vous pouvez le faire en modifiant l'attribut MaxRequestBodySize
dans le rappel de l'un ou l'autre des éléments suivants UseKestrel
ou UseHttpSys
. MaxRequestBodySize
est un long nullable dans les deux cas. Par exemple :
.UseKestrel(options =>
{
options.Limits.MaxRequestBodySize = null;
ou
.UseHttpSys(options =>
{
options.MaxRequestBodySize = 100_000_000;
Quel est le plus gros fichier que vous ou quelqu'un d'autre a pu télécharger avec succès avec ce système ? Je suis juste curieux car je travaille sur un projet qui nécessitera de gros téléchargements pour des communications sécurisées.
J'ai téléchargé des fichiers de 10 Go. Je pense que vous ne seriez limité que par l'atteinte d'un paramètre de délai d'attente maximal du serveur, ou par l'atteinte d'une limite de mémoire/de stockage de fichiers, selon la façon dont vous diffusez/stockez les fichiers.
Dans mon cas, le DisableRequestSizeLimit
n'était pas suffisant. J'ai dû utiliser l'attribut RequestFormLimits
aussi. Comme ceci : [HttpPost("upload"), DisableRequestSizeLimit, RequestFormLimits(MultipartBodyLengthLimit = Int32.MaxValue, ValueLengthLimit = Int32.MaxValue)]
Vous obtenez probablement un code d'état HTTP 404.13 lorsque vous téléchargez un fichier de plus de 30 Mo. Si vous exécutez votre application ASP.Net Core dans IIS, le pipeline IIS intercepte votre requête avant qu'elle n'atteigne votre application.
Mettez à jour votre web.config :
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
<!-- Add this section for file size... -->
<security>
<requestFiltering>
<!-- Measured in Bytes -->
<requestLimits maxAllowedContentLength="1073741824" /> <!-- 1 GB-->
</requestFiltering>
</security>
</system.webServer>
Les applications ASP.Net précédentes nécessitaient également cette section, mais elle n'est plus nécessaire dans Core puisque vos requêtes sont traitées par un intergiciel :
<system.web>
<!-- Measured in kilobytes -->
<httpRuntime maxRequestLength="1048576" />
</system.web>
Si vous copiez/collez aveuglément ce qui précède, <cough> comme je ne le ferais jamais, </cough> n'oubliez pas qu'elle doit être imbriquée dans la section <configuration>
élément. blogs.msdn.microsoft.com/azureossds/2016/06/15/
Dans le projet ASP.NET Core 1.1 qui a été créé par Visual Studio 2017, si vous voulez augmenter la taille du fichier de téléchargement. Vous devez créer le fichier web.config par vous-même, et ajouter ces contenus :
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<security>
<requestFiltering>
<!-- 1 GB -->
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
</system.webServer>
</configuration>
Dans le fichier Startup.cs, ajoutez ces contenus :
public void ConfigureServices(IServiceCollection services)
{
services.Configure<FormOptions>(x =>
{
x.ValueLengthLimit = int.MaxValue;
x.MultipartBodyLengthLimit = int.MaxValue;
x.MultipartHeadersLengthLimit = int.MaxValue;
});
services.AddMvc();
}
Je suis peut-être en retard, mais voici la solution complète pour télécharger un fichier d'une taille supérieure à 30.0 Mo dans ASP.NET Core Version >=2.0 :
Vous devez suivre les trois étapes suivantes :
1. Limite de longueur du contenu de l'IIS
La limite de demande par défaut ( maxAllowedContentLength
) est 30,000,000 octets, ce qui représente environ 28.6 MB . Personnalisez la limite dans le web.config
fichier :
<system.webServer>
<security>
<requestFiltering>
<!-- Handle requests up to 1 GB -->
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
</system.webServer>
Note : sans cette application fonctionnant sur IIS, elle ne fonctionnerait pas.
2. ASP.NET Core Limitation de la longueur des requêtes
Pour les applications fonctionnant sur IIS :
services.Configure<IISServerOptions>(options =>
{
options.MaxRequestBodySize = int.MaxValue;
});
Pour une application fonctionnant sur Kestrel :
services.Configure<KestrelServerOptions>(options =>
{
options.Limits.MaxRequestBodySize = int.MaxValue; // if don't set default value is: 30 MB
});
3. Limite de longueur du corps multipartite du formulaire
services.Configure<FormOptions>(options =>
{
options.ValueLengthLimit = int.MaxValue;
options.MultipartBodyLengthLimit = int.MaxValue; // if don't set default value is: 128 MB
options.MultipartHeadersLengthLimit = int.MaxValue;
});
L'ajout de toutes les options ci-dessus résoudra le problème lié au téléchargement de fichiers d'une taille supérieure à 30,0 Mo.
J'ai fait les 3 étapes mentionnées ci-dessus, mais j'ai toujours un problème de CORS. Si vous pouvez ajouter des éléments de débogage, cela aidera quelqu'un. - J'ai juste sauté cette étape services.Configure<IISServerOptions>(options => comme j'utilise web api 2.1 c#
Dans votre startup.cs
configurer FormsOptions
Fonctionnalité Http :
public void ConfigureServices(IServiceCollection services)
{
services.Configure<FormOptions>(o => // currently all set to max, configure it to your needs!
{
o.ValueLengthLimit = int.MaxValue;
o.MultipartBodyLengthLimit = long.MaxValue; // <-- !!! long.MaxValue
o.MultipartBoundaryLengthLimit = int.MaxValue;
o.MultipartHeadersCountLimit = int.MaxValue;
o.MultipartHeadersLengthLimit = int.MaxValue;
});
}
Utilisez IHttpMaxRequestBodySizeFeature
Fonctionnalité Http à configurer MaxRequestBodySize
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = null; // unlimited I guess
await next.Invoke();
});
}
Kestrel :
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>.UseKestrel(o => o.Limits.MaxRequestBodySize = null);
});
IIS --> web.config :
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<!-- ~ 2GB -->
<httpRuntime maxRequestLength="2147483647" /> // kbytes
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- ~ 4GB -->
<requestLimits maxAllowedContentLength="4294967295" /> // bytes
</requestFiltering>
</security>
</system.webServer>
</configuration>
Http.sys :
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>().UseHttpSys(options =>
{
options.MaxRequestBodySize = null;
});
});
Si vous voulez télécharger un très gros fichier, potentiellement plusieurs Go, et que vous voulez le mettre en mémoire tampon dans un fichier de type MemoryStream
sur le serveur, vous obtiendrez un message d'erreur Stream was too long
car la capacité de l MemoryStream
est int.MaxValue
.
Vous devrez mettre en place votre propre MemoryStream
classe. Mais de toute façon, mettre en mémoire tampon de si gros fichiers n'a aucun sens.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.