IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

fileupload+tester la taille du fichier


Sujet :

ASP.NET

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut fileupload+tester la taille du fichier
    Bonjour, j'utilise un composant Fileupload et je voudrais tester la taille du document uploader pour savoir s'il est supérieure à la taille max accordée qui est actuellement et par défaut de 4Mo.

    Le problème est lorsque je clique sur le bouton de validation, j'ai la fênetre Internet Explorer ne peut pas afficher cette page Web. Et en mode debugger, il ne passe pas par le click du bouton, c'est comme s'il savait déjà qu'il ne peut pas aller plus loin. Comment intercepter cette "erreur".

    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 295
    Points
    295
    Par défaut
    Le code pour tester la taille
    FileUpload.PostedFile.ContentLength < 197000


    Par contre pour ton problème met un peu de code.

    De quel bouton tu parles ? le bouton "Parcourir" ou le bouton de validation que tu associe a ton controle

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Cette erreur provient du fait que la taille des requêtes est limité.

    Par défaut, tu ne peux uploader de fichier de plus de 2 Mo. Il est possible d'augmenter la taille maximale pour une application ASP.NET en ajoutant une petite ligne dans le web.config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <httpRuntime maxRequestLength="32768" />
    (je ne sais plus exactement où la mettre, regarde la doc)
    (32768 équivaut à 32 Mo pour l'exemple)

    Le problème effectivement, c'est que le navigateur, pour les requêtes plus grandes, affiche "qu'il ne peut afficher la page". Il n'y a aucun moyen de catcher cette erreur malheureusement car je pense que IIS bloque le flux avant de le transmettre à ASP.NET.

    Le problème en HTML classique, c'est qu'il est impossible de tester la taille du fichier avant l'envoi vers le serveur. Il faut passer par des solutions alternatives (uploader via ActiveX / Flash / Silverlight).

  4. #4
    Membre habitué
    Inscrit en
    Décembre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2003
    Messages : 108
    Points : 129
    Points
    129
    Par défaut
    pour catcher cette erreur tu peux passer par un httpmodule, je joint un bout de code qui je l'espère pourra t'aider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     public class UploadHttpModule : IHttpModule
        {
            /// <summary>
            /// Initialize the HttpModule
            /// </summary>
            /// <param name="context"></param>
            void IHttpModule.Init(HttpApplication context)
            {
                if (context == null)
                {
                    throw new ArgumentNullException("context");
                }
                context.BeginRequest += OnBeginRequest;
            }
     
            private void OnBeginRequest(object sender, EventArgs e)
            {
                HttpApplication app = (HttpApplication)sender;
                if (app != null)
                {
                    if (app.Request.ContentType.StartsWith("multipart/form-data") && app.Request.ContentLength > 0)
                    {
                        int fileSize = app.Request.ContentLength;
     
                        HttpRuntimeSection httpRuntimeSection = ConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
                        int httpMaxSize = httpRuntimeSection.MaxRequestLength;
     
                        if (fileSize > httpMaxSize * 1024)
                        {
                            int maxRequestLengthExceeded = 1;
     
                            //throw new ApplicationException("File too big");
                            StringBuilder redirectUrl = new StringBuilder(app.Request.Url.AbsolutePath);
                            redirectUrl.Append("?");
                            for (int i = 0; i < app.Request.QueryString.Count; i++)
                            {
                                if (app.Request.QueryString.Keys[i] != "maxRequestLengthExceeded")
                                {
                                    redirectUrl.Append(app.Request.QueryString.Keys[i]);
                                    redirectUrl.Append("=");
                                    redirectUrl.Append(app.Request.QueryString[i]);
                                    redirectUrl.Append("&");
                                }
                                else
                                {
                                    int.TryParse(app.Request.QueryString[i], out maxRequestLengthExceeded);
                                    maxRequestLengthExceeded++;
                                }
                            }
                            redirectUrl.Append("maxRequestLengthExceeded=");
                            redirectUrl.Append(maxRequestLengthExceeded.ToString());
                            app.Response.Redirect(redirectUrl.ToString());
                        }
                    }
                }
            }
     
            void IHttpModule.Dispose()
            {
                //nothing to do
            }
        }

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Donc, c'est le handler ASPX qui bloque le flux. Intéressant, j'y avais pas pensé.

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    Bonjour à tous, alors le probleme est bien là j'ai la taille qui est limité à 4Mo en upload et lorsque je veux uploader un fichier plus grand, le upload fonctionne mais lorsque j'appelle le serveur il me dit : IE ne peut pas afficher cette page web.
    Actuellement je teste ajax avec un custom validator mais il ne passe pas dans le code en question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    protected void MaximumSize(object source, ServerValidateEventArgs args)
        {
            //Get the information about the file that was uploaded.   
            HttpPostedFile postedfile = FUPieceJointe.PostedFile;
     
            //If the file was more than the minimum size   
            //of 4K, reject it.   
            if (postedfile.ContentLength > 4095)//4096 valeur en ko
            {
                args.IsValid = false;
                mPassedValidation = false;
            }
            else
                args.IsValid = true;
        }
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     protected void btnAjouterPJ_Click(object sender, CommandEventArgs e)
        { 
            if (mPassedValidation)
            {
    puis code aspx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <asp:CustomValidator Display="Dynamic" ID="CustomValidator1" runat="server" ErrorMessage="error" ControlToValidate="FUPieceJointe" OnServerValidate="MaximumSize"></asp:CustomValidator>
     
                <asp:Panel ID="PanelAjoutDocLie" runat="server" Visible="false">
                    <div class="ligne_form">
                        <div style="width:200px;text-align:left;">
                            <asp:Label ID="lblDocAttacheEtape" runat="server" Text="Document à attacher :"></asp:Label>
                        </div>
                        <div style="width:10px;">
                            <asp:Label ID="lblDocAttacheEtapeVide" Text="&nbsp;" runat="server"></asp:Label>
                        </div>
                        <div style="width:250px;">
                            <asp:FileUpload runat="server" ID="FUPieceJointe" />
                        </div>
                        <div class="bt_vide">
                            <asp:Label runat="server" ID="lblTailleEspace" Text="&nbsp;"></asp:Label>
                        </div>
                        <div>
                            <asp:Label runat="server" ID="lblTaille" Text="Taille limitée à 4M octets"></asp:Label>
                        </div>
                    </div>
                    <div class="ligne_form">
                        <div style="width:200px;text-align:left">
                            <asp:Label ID="lblDesignationDocEtape" runat="server" Text="Désignation du document :"></asp:Label>
                        </div>
                        <div style="width:10px">
                            <asp:Label ID="lblDesignationDocEtapeEspace" runat="server" Text="&nbsp;" ></asp:Label>
                        </div>
                        <div>
                            <asp:TextBox ID="txbDesignationDocEtape" runat="server" style="width:404px" ></asp:TextBox>
                        </div>
                        <div style="width:30px;">
                            <asp:TextBox ID="txbAjouter" Visible="false" runat="server" style="width:170px" ></asp:TextBox>
                        </div>
                        <div>
                            <asp:Button ID="btnAjouterPJ" runat="server" CssClass="bt_ajouter" Text="Ajouter" OnCommand="btnAjouterPJ_Click"></asp:Button>
                        </div>
                    </div>

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2003
    Messages : 108
    Points : 129
    Points
    129
    Par défaut
    d'où le code du httpHandler que j'ai fourni, celui-ci passe bien avant, c'est comme le global.asax qui est appellé bien avant ta page

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    ok mastervanou, mais je le mets comment en place. Je fais une classe avec ton code et ensuite je fais hérité ma page "documents" de cette classe?

  9. #9
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Y'a une différence entre paramétrer ton application pour qu'elle ne limite pas la taille des fichiers et tester leur taille.

    Que veux-tu faire avec cette information?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    C'est simple Immobilis, je veux que dans mon web.config cela soit egal à 4M
    ensuite je veux qu'au moment où l'utilisateur cherche un document (ou lors du bouton de validation) tester si la taille est < à la taille du web.config; si tel est le cas c'est bon sinon je veux lui afficher un message.

  11. #11
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Le serveur ne peut déterminer la taille d'un fichier qu'il n'a pas encore reçu.

    Il s'agit dans ce cas d'un test chez le client avant que le fichier ne soit envoyé. Il faut un composant navigateur (ActiveX) capable d'aller vérifier la taille d'un fichier. Ce composant doit donc accéder au système de fichiers...

    Tu imagines la suite?

    Mais bon, en cherchant bien sur le net on devrait pouvoir trouver.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  12. #12
    Membre habitué
    Inscrit en
    Décembre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2003
    Messages : 108
    Points : 129
    Points
    129
    Par défaut
    au risque de me répéter le code que j'ai fourni permet d'intercepter l'erreur provoquée par l'upload d'un fichier trop gros (j'ai eu ce soucis sur un projet)

    il suffit de créer un fichier.cs y inclure le code ensuite faire du debug pour ajuster le code

  13. #13
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    ok je vais voir comment je peux gérer cela.
    Merci

  14. #14
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par mastervanou Voir le message
    au risque de me répéter le code que j'ai fourni permet d'intercepter l'erreur provoquée par l'upload d'un fichier trop gros (j'ai eu ce soucis sur un projet)
    Y'a pas de soucis à ce niveau, mais quand on télécharge un fichier et que ça prend 3 plombes, y'a rien de plus désagréable que de recevoir un message, au bout d'1 minute, indiquant qu'il est trops gros. C'est pour cela qu'il peut être interessant de disposer d'un composant qui verifie cela avant le début du téléchargement.

    Mais un tel composant pose des contraintes de sécurité.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/08/2008, 12h17
  2. Tester la taille d'un fichier
    Par stylee307 dans le forum Windows
    Réponses: 0
    Dernier message: 22/04/2008, 04h05
  3. tester la taille d'un fichier TXT
    Par donbrico dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 11/02/2008, 21h58
  4. Tester la taille de fichier avant upload
    Par RobinNono dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 27/06/2006, 17h38
  5. [FileUpload]Controle de la taille du fichier transféré
    Par K-Kaï dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 30/05/2006, 10h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo