Avatar billede Kim Neesgaard Seniormester
21. august 2008 - 09:49 Der er 46 kommentarer og
1 løsning

Page_Error - fang fejl og giv brugere en besked

Jeg har en side, hvor man kan uploade filer til serveren. Hvis filen er for stor, vil dette gennem løbes:

Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
        lblInfo.Text = "Error" & Err.Description
End Sub

men efter End Sub går siden helt ned og kommer med en grim gul fejlbesked.

Jeg er klar over, at man i web.config kan øge den tilladte størrelse til fx. 10 MB med:

<httpRuntime maxRequestLength="10000" />

men filen kan jo være større og så skal brugeren også have besked.

Hvordan fanger man denne situation?

Hvordan kan man fange denne situation og give brugeren en pæn besked om, at filen er for stor?
Avatar billede simsen Mester
21. august 2008 - 11:22 #1
Punkt 1 - du skal have httpRuntime med i din web.config fil.

Så har jeg brugt nedennævnte kode (oversat fra c# til vb - så undskyld, hvis oversætteren ikke har gjort det helt korrekt...)

If fuplOpskriftBillede.HasFile = True Then
    'Hvis antal mb> 4 mb skal den fremkomme med en fejlbesked
    If fuplOpskriftBillede.PostedFile.ContentLength > 1000000 Then
    Else
        'Laver en ny instans og finder filnavn
        Dim filInfo As New FileInfo(fuplOpskriftBillede.FileName)
       
        'Laver en streng med stien og navn filen der uploades skal gemmes som
        Dim destination As String = Page.MapPath("~/Upload/Bruger/") + Convert.ToString(user_id) + "\" + filInfo.Name
       
        'Upload af filen
        Try
            fuplOpskriftBillede.SaveAs(destination)
            billedenavn = filInfo.Name
        Catch
        End Try
       
        'Gemmer billede i tabellen
        Try
            Dim opskriftapi As New OpskrifterApi()
           
            If opskriftapi.SetOpskriftBillede(opskriftid, billedenavn) = Status.Success Then
            End If
           
            opskriftapi.Dispose()
        Catch
        End Try
    End If
End If

mvh
simsen :-)
Avatar billede Kim Neesgaard Seniormester
21. august 2008 - 11:47 #2
Hvordan og hvor skal httpRuntime stå?
Avatar billede simsen Mester
21. august 2008 - 14:24 #3
Den står under <system.web> i mit tilfælde efter <pages>:
<system.web>
        <pages>
            <controls>
                <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit" tagPrefix="ajaxToolkit"/>
            </controls>
        </pages>
        <httpRuntime maxRequestLength="400000"/>
Avatar billede Kim Neesgaard Seniormester
21. august 2008 - 14:51 #4
Åh - jeg læste gal, den havde jeg jo allerede prøvet at sætte!

Hvis jeg sætter:

<httpRuntime maxRequestLength="8000" />  'Er enheden kb?

og

If fuplOpskriftBillede.PostedFile.ContentLength > 8000 Then  'Også enhed kb?

så giver den alligevel fejl i:

Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
?
Avatar billede pidgeot Nybegynder
21. august 2008 - 14:57 #5
Fra MSDN:

http://msdn.microsoft.com/en-us/library/e1f13641(VS.71).aspx:
maxRequestLength    Indicates the maximum file upload size supported by ASP.NET. This limit can be used to prevent denial of service attacks caused by users posting large files to the server. The size specified is in kilobytes. The default is 4096 KB (4 MB).

http://msdn.microsoft.com/en-us/library/system.web.httppostedfile_members.aspx:
ContentLength Gets the size of an uploaded file, in bytes. 

*går igen*
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 08:58 #6
pidqeot -> begge links giver kun 'bad request'?
Avatar billede simsen Mester
22. august 2008 - 09:06 #7
Lav en søgning på MSDN - den er der, man kan åbenbart ikke linke til den:

http://search.msdn.microsoft.com/?query=maxRequestLength%20web.config&locale=da-dk&ac=8

Gør det samme med ContentLength - så får du sikkert også den frem......

Og den er altså god nok, hvad pidgeot skriver :-)
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 09:27 #8
Ok - men jeg har stadig det fænomen, at hvis jeg uploader en fil på fx. 9,2 MB med en <httpRuntime maxRequestLength="8000" />, så går skærmen bare i grå/fejl uden at noget gennemløbes?
Avatar billede simsen Mester
22. august 2008 - 09:32 #9
Min erfaring er, at i web.config'en sættes den til f.eks. 10 mb og så i koden, hvor man tester for hvor meget den er (altså mindre end) skal den teste på mindre end 10 mb - f.eks. 9 mb....
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 09:38 #10
Problemet er, at jeg ikke kan få den til at gennemløbe:

If fuplOpskriftBillede.PostedFile.ContentLength > 8000 Then
osv.

uanset om jeg sætter den til under halvdelen af max. i web.config?
Avatar billede simsen Mester
22. august 2008 - 10:01 #11
Har du ændret:
fuplOpskriftBillede til det din upload kontrol hedder?
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 10:01 #12
Når filstørrelsen er mindre end <httpRuntime maxRequestLength="8000" />, så gennemløbes uden problemer.
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 10:01 #13
Ja - den er rettet til den, jeg bruger.
Avatar billede simsen Mester
22. august 2008 - 10:05 #14
Underligt - når du laver en "run to curser" - så fortæller den dig ikke nogen fejlmeddelelser - den springer bare If fuplOpskriftBillede.PostedFile.ContentLength > 8000 over?
Avatar billede simsen Mester
22. august 2008 - 10:09 #15
Hov - nu er jeg forfærdelig dum til at regne de der bytes og kb om til mb...... Men er du sikker på, at de 8000 der står i web.config'en er større antal end det der står i din cs fil?

Forsøg at ændre web.config til 10000 og så gennemløb den igen......Som skrevet tidligere, har jeg den erfaring at web.config delen skal være større end det jeg tester på.....
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 10:13 #16
Hvis jeg ændrer i web.config til 10000, så uploader den filen på 9,2 MB uden det mindste klynkeri! Det er kun hvis filen er over det, der står i web.config, at programmet går ned?
Avatar billede simsen Mester
22. august 2008 - 10:20 #17
Ja det er også naturligt - der du fortæller, hvor stor max den må være altså filen....

Hmmmmm længe siden, jeg knoklede rundt i det - sæt den til 8 igen og kør en "run to curser" i din cs fil, og fortæl mig så hvad der helt nøjagtig sker lige før og under:

fuplOpskriftBillede.PostedFile.ContentLength > 7000

Sæt tallet efter > til at være mindre (1 mb mindre end det der står i web.config)
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 10:42 #18
Jeg kører VB og prøvede at oversætte 'run to curser' - hvad hedder kommandoen helt nøjagtigt og hvor sætter jeg den ind?
Avatar billede simsen Mester
22. august 2008 - 11:04 #19
Det tror jeg, ikke har noget at gøre med, om det er VB eller c# - det er en VS ting.

Du klikker på en linie (skal være noget kode på den linie) ovenover, hvor du vil checke ud, hvad det er den gør og højreklikker med musen. Du kan nu vælge mellem forskellige punkter - der er et punkt der hedder "Run to Curser"

Den vælger du, og kører så din side (i dette tilfælde indtil upload delen, hvor du har lavet din "run to curser"), indtil den kører tilbage til din kode og den linie du stillede dig på i koden bliver gult.

Du har nu mulighed for at steppe dig stille og roligt igennem den efterfølgende kode. Enten ved F10 eller F11 - F10 = Step over F11 = Step into.

Er der fejl, vil du se dem (ligesom breakpoints). Men du kan hele tiden følge med, hvad sker hvornår - en rigtig god funktion, jeg bestemt ikke kan undvære.....bruger den 117 gange om dagen *griner*
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 13:04 #20
Ok - jeg kendte bare ikke det udtryk! Det bruger jeg også meget. Jeg har lavet denne:

If FileUploadEBLD.PostedFile.ContentLength > 7000000 Then
            lblInfoFiles.Text = "File is too big"
            Exit Sub
End If

Sagen er den, at hvis den vedhæftede fil er mindre end angivet i web.config, så løber den fint igennem koden, men går selvfølgelig ikke ind i if-sætningen. Men hvis den vedhæftede fil er større end angivet i web.config, så gennemløber den slet ikke denne kode, men går ned uden videre.

Hvis den vedhæftede fil er for stor, så løber den kun igennem dette kode:

Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
        Try

        Catch ex As Exception

        End Try
End Sub

og her er gennemløbes Try - End Try - End Sub og næste step slukker programmet. Den går ikke engang igennem Catch og det synes jeg, er meget mærkeligt!
Avatar billede simsen Mester
22. august 2008 - 13:24 #21
Jeg ved ikke rigtig, hvordan jeg skal hjælpe dig..........

Sådan ser min kode ude (oversætter kan du finde her: http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx)

og den virker, har lige testet den igen - hvis filen er for stor, går den ind og sætter lblStatus.Visible = true....

Min kode:
//Upload af billede, hvis der er et billede
                    string billedenavn = "";

                    if (fuplBrugerBillede.HasFile == true)
                    {
                        //Hvis antal mb> 4 mb skal den fremkomme med en fejlbesked
                        if (fuplBrugerBillede.PostedFile.ContentLength > 5000)
                        {
                            lblStatus.Visible = true;
                            lblStatus.Text = "Filen er for stor til at uploade";
                        }
                        else
                        {
                            //Laver en ny instans og finder filnavn
                            FileInfo filInfo = new FileInfo(fuplBrugerBillede.FileName);

                            //Laver en streng med stien og navn filen der uploades skal gemmes som
                            string destination = Page.MapPath("~/Upload/Bruger/") + lblBrugerId.Text + "\\" + filInfo.Name;

                            //Upload af filen
                            try
                            {
                                fuplBrugerBillede.SaveAs(destination);
                                billedenavn = filInfo.Name;
                            }
                            catch
                            { }
                        }
                    }

Min web.config:
<httpRuntime maxRequestLength="400000"/>
Avatar billede simsen Mester
22. august 2008 - 13:25 #22
Det skal siges, da jeg knoklede rundt med det her, fik jeg også samme fejl som du - men da jeg tilrettede min webconfig, så den var større end det jeg spurgte på, fik jeg det til at fungere :-)
Avatar billede Kim Neesgaard Seniormester
22. august 2008 - 14:50 #23
Det skal køre på min arbejdsmaskine - jeg prøver på mandag.
Avatar billede Kim Neesgaard Seniormester
25. august 2008 - 10:09 #24
Jeg fatter det ikke! Nu har jeg lavet et testprogram uden at specificere noget i web.config. Når filstørrelsen er mindre end defaultstørrelsen går alt godt, men når den er større, så går alt i sort!!
Kunne jeg få dig til at sende lige nøjagtigt, hvad du har stående i web.config ifm. maxRequestLength?
Avatar billede Kim Neesgaard Seniormester
25. august 2008 - 10:42 #25
Det er åbenbart en fejl i .NET frameworket - se:

http://forums.asp.net/t/1289157.aspx

og

http://www.vikramlakhotia.com/Dealing_With_the_ASPNet_Upload_File_Size_Problem.aspx

men heller ikke dette kan jeg få til at virke! Har du et bud?
Avatar billede simsen Mester
28. august 2008 - 12:33 #26
Hejsa igen,

Det har jeg givet dig:

<httpRuntime maxRequestLength="400000"/>

Kan du ikke lave en testversion og så zippe den ned og sende til mig - så vil jeg forsøge at kigge på det?
Avatar billede Kim Neesgaard Seniormester
28. august 2008 - 16:08 #27
Så har jeg et eksempel og jeg har bare brugt dafaultfilstørrelsen, da fænomenet er helt det samme, når denne overskrides. Hvor skal jeg sende det til?
Avatar billede simsen Mester
03. september 2008 - 09:03 #28
neesgaard
Sorry, jeg først svarer nu - men har haft ferie :-)

Send det til blue@mail-online.dk (er alligevel kun en spam mail konto, jeg bruger, så sker ikke noget ved at oplyse den her) :-)
Avatar billede Kim Neesgaard Seniormester
03. september 2008 - 17:12 #29
Helt ok - håber du havde en god ferie! Filen er afsendt.
Avatar billede simsen Mester
04. september 2008 - 14:48 #30
hmmmmmm har du sendt den som zip fil eller how? Har nemlig ikke modtaget noget.....
Avatar billede Kim Neesgaard Seniormester
04. september 2008 - 16:08 #31
Den er sendt som .zip, men er måske af den grund fjernet. Jeg sender den en gang til som .123 fil som så kan omdøbes.
Avatar billede Kim Neesgaard Seniormester
04. september 2008 - 16:50 #32
Den er nu sendt igen!
Avatar billede simsen Mester
04. september 2008 - 18:41 #33
neesgaard,

Du manglede at sætte <httpRuntime maxRequestLength="400000"/> ind i web.config......

Web.config for den solution du har sendt mig:
<?xml version="1.0"?>
<!--
    Note: As an alternative to hand editing this file you can use the
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in
    machine.config.comments usually located in
    \Windows\Microsoft.Net\Framework\v2.x\Config
-->
<configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <!--
            Set compilation debug="true" to insert debugging
            symbols into the compiled page. Because this
            affects performance, set this value to true only
            during development.

            Visual Basic options:
            Set strict="true" to disallow all data type conversions
            where data loss can occur.
            Set explicit="true" to force declaration of all variables.
        -->
        <compilation debug="true" strict="false" explicit="true"/>
        <pages>
            <namespaces>
                <clear/>
                <add namespace="System"/>
                <add namespace="System.Collections"/>
                <add namespace="System.Collections.Specialized"/>
                <add namespace="System.Configuration"/>
                <add namespace="System.Text"/>
                <add namespace="System.Text.RegularExpressions"/>
                <add namespace="System.Web"/>
                <add namespace="System.Web.Caching"/>
                <add namespace="System.Web.SessionState"/>
                <add namespace="System.Web.Security"/>
                <add namespace="System.Web.Profile"/>
                <add namespace="System.Web.UI"/>
                <add namespace="System.Web.UI.WebControls"/>
                <add namespace="System.Web.UI.WebControls.WebParts"/>
                <add namespace="System.Web.UI.HtmlControls"/>
            </namespaces>
        </pages>
        <!--
            The <authentication> section enables configuration
            of the security authentication mode used by
            ASP.NET to identify an incoming user.
        -->
        <authentication mode="Windows"/>
        <!--
            The <customErrors> section enables configuration
            of what to do if/when an unhandled error occurs
            during the execution of a request. Specifically,
            it enables developers to configure html error pages
            to be displayed in place of a error stack trace.

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
        <httpRuntime maxRequestLength="100000"/>
    </system.web>
</configuration>


som du kan se - er den eneste ændring neders, hvor jeg har sat <httpRuntime maxRequestLength="100000"/> ind....og uploader jeg nu en fil, der er større end 7mb får jeg din fejlbesked frem og ikke den almindelige fejlside......som vi begge er enige om, ikke kan bruges til noget....

mvh
simsen :-)
Avatar billede simsen Mester
08. september 2008 - 11:58 #34
Ved at være lukketid her? :-)
Avatar billede Kim Neesgaard Seniormester
08. september 2008 - 12:07 #35
Ikke helt for jeg kan stadig ikke få det til at virke. I dit eksempel har du en max. grænse på 100 MB som jeg læser antallet af nuller og det er kun i tilfældet at man uploader en fil STØRRE end max. grænsen, at jeg får fejlen.

Fejlbesked vil derfor gives og fanges med filstørrelser mellem 7 MB og een byte mendre end 100 MB.

På samme måde hvis man bruger defaultværdien ca. 4 MB - op til 4 MB ingen problemer, men filer større end 4 MB giver den grimme fejl.
Avatar billede Kim Neesgaard Seniormester
08. september 2008 - 12:08 #36
Hvad sker der, hvis du bruger defaultværdien og uploader en fil på fx. 10 MB?
Avatar billede simsen Mester
09. september 2008 - 09:56 #37
Jeg forstår ikke, du har problemer...........

Jeg bruger de filer du har sendt til mig - med den rettelse, som jeg har vist her - og uploader en fil på 8255kb og får den fejlbesked du har sat ind - nemlig:

File is too big

1) Du skal sørge for at i din web.config at filstørrelsen er større end det du max vil tillade........altså om det er 100 eller 1000 mb er fuldstændig ligegyldigt...
2) det er så i din kode, du bestemmer, hvor meget du vil tillade - har du sat den i web.config til 100mb skal du sætte den til mindre altså =< 99 mb......

I det eksempel du har sendt til mig, har du i din fil sat den til: 7000000 som så er ca. 7 mb....... det vil sige - alt under ca 7 mb (og ja jeg er forfærdelig til at regne de der tal ud - jeg afrunder groft) vil gå igennem - alt over 7 mb og til de 100 mb, vil gå godt (= korrekt fejlmeddelelse)

Jeg har lige testet ved at uploade en 17 mb fil - den får også fejlmeddelelsen......
Avatar billede simsen Mester
09. september 2008 - 10:01 #38
Jeg tror det er din forståelse for <httpRuntime maxRequestLength="8000" /> i web.config den er galt med - du tester IKKE her om den er større og så skal fremkomme med fejlmeddelelse - det eneste (groft sagt) den gør, er at fortælle, hvor meget du vil tillade den kan uploade uden den grimme side fremkommer....

Der hvor du tester, er i din vb fil - altså

If FileUpload1.PostedFile.ContentLength > 7000000

Der skal du så huske den skal sættes til et mindre tal end det du har i web.config'en
Avatar billede Kim Neesgaard Seniormester
10. september 2008 - 08:49 #39
Ok - nu har jeg lavet en helt frisk side til test.

web.config: <httpRuntime maxRequestLength="8000"/>    Altså 8 MB

Koden til siden ser sådan ud:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim path As String = Server.MapPath("~/UploadedImages/")

        If FileUpload1.PostedFile.ContentLength > 2000000 Then
            Label1.Text = "File too big"
            Exit Sub
        Else
            Try
                FileUpload1.PostedFile.SaveAs(path & _
                    FileUpload1.FileName)
                Label1.Text = "File uploaded!"
            Catch ex As Exception
                Label1.Text = Err.Description
            End Try
        End If

End Sub

Altså 2 MB og dermed meget sikker 'afstand' til de 8 MB.

Jeg uploader herefter 3 filer med følgende størrelser:

1/ 44 KB - upload foretages med meldingen File uploaded!

2/ 2546 KB - altså ca. 2,5 MB. Upload foretages ikke og beskeden File too big fås. Dette er en fil, der i størrelse ligger mellem 2 MB og 8 MB.

3/ 9426 KB - altså over grænse i kode og web.config. Det er så her, at det går galt. FileUpload1.PostedFile.ContentLength fanger ikke denne situation og skærmen går i gul.
Avatar billede simsen Mester
10. september 2008 - 10:15 #40
Jamen den gør jo nøjagtig det den skal så :-)

Du fortæller i web.config hvor højt du vil teste op til......... Så hvis du vil at den skal teste f.eks. til 100 mb så sætter du 100mb ind i web.config...... At du så ikke tillader 100mb men kun 2mb (i selve din vb kode) er jo så en anden sag :-)
Avatar billede Kim Neesgaard Seniormester
10. september 2008 - 10:42 #41
Ok - jeg kunne bare godt lide, at brugeren ikke får en gul skærm, hvis han/hun kommer til at uploade en for stor fil! Men ellers tak for sin tålmodighed!!
Avatar billede simsen Mester
10. september 2008 - 11:38 #42
Nu aner jeg ikke hvad det er de skal uploade - MEN hvis du sætter den til 100mb - så er det nok ulovlige ting, de vil uploade......og så er jeg personligt ligeglad med om de får en gul skærm........ Du fanger jo dem, der bare forsøger at uploade f.eks. et billede, der er for stort - ved din fejlmelding så :-)
Avatar billede Kim Neesgaard Seniormester
10. september 2008 - 12:55 #43
Ja - det har du ret i! Det vil jeg fluks gøre.
Avatar billede simsen Mester
15. september 2008 - 13:59 #44
Nu må det da vist være lukketid :-)
Avatar billede Kim Neesgaard Seniormester
15. september 2008 - 14:11 #45
Det har du da hel ret - accept kommer her!!
Avatar billede simsen Mester
17. september 2008 - 08:47 #46
Så mangler du også bare lige at acceptere ;-)
Avatar billede Kim Neesgaard Seniormester
17. september 2008 - 09:55 #47
Således!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester