Avatar billede a55830 Praktikant
29. maj 2009 - 05:32 Der er 7 kommentarer og
1 løsning

uploade virker kun på små filer, men jeg skal uploade op til 10mb

hej der ude
har et "lille" problem mit oploade script vil ikke tillade mig at oploade filer over 300k men jeg skal oploade filer over 10mb

her er koden :

<%
class FileUploader
    Public  Files
    Private mcolFormElem
    Private aProhibit

    Private Sub Class_Initialize()
        Set Files = Server.CreateObject("Scripting.Dictionary")
        Set mcolFormElem = Server.CreateObject("Scripting.Dictionary")
        aProhibit = array("asp","exe","php","aspx","asa","cgi","htm","html")
    End Sub
   
    Private Sub Class_Terminate()
        If IsObject(Files) Then
            Files.RemoveAll()
            Set Files = Nothing
        End If
        If IsObject(mcolFormElem) Then
            mcolFormElem.RemoveAll()
            Set mcolFormElem = Nothing
        End If
    End Sub

    Public Property Get Form(sIndex)
        Form = ""
        If mcolFormElem.Exists(LCase(sIndex)) Then Form = mcolFormElem.Item(LCase(sIndex))
    End Property

    Public Default Sub Upload()
        Dim biData, sInputName
        Dim nPosBegin, nPosEnd, nPos, vDataBounds, nDataBoundPos
        Dim nPosFile, nPosBound

        biData = Request.BinaryRead(Request.TotalBytes)
        nPosBegin = 1
        nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(13)))
       
        If (nPosEnd-nPosBegin) <= 0 Then Exit Sub
       
        vDataBounds = MidB(biData, nPosBegin, nPosEnd-nPosBegin)
        nDataBoundPos = InstrB(1, biData, vDataBounds)
       
        Do Until nDataBoundPos = InstrB(biData, vDataBounds & CByteString("--"))
       
            nPos = InstrB(nDataBoundPos, biData, CByteString("Content-Disposition"))
            nPos = InstrB(nPos, biData, CByteString("name="))
            nPosBegin = nPos + 6
            nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(34)))
            sInputName = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
            nPosFile = InstrB(nDataBoundPos, biData, CByteString("filename="))
            nPosBound = InstrB(nPosEnd, biData, vDataBounds)
           
            if nPosFile <> 0 And  nPosFile < nPosBound then
                Dim oUploadFile, sFileName
                Set oUploadFile = New UploadedFile
               
                nPosBegin = nPosFile + 10
                nPosEnd =  InstrB(nPosBegin, biData, CByteString(Chr(34)))
                sFileName = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
                if oUploadFile.FileName = "" or isNull(oUploadFile.FileName) then
                    ''' read the name of the file
                    oUploadFile.FileName = Right(sFileName, Len(sFileName)-InStrRev(sFileName, "\"))
                    for x = 0 to uBound(aProhibit)
                    if inStr(right(lcase(oUploadFile.FileName),4),aProhibit(x))>0 then
                        b_error = true
                        exit sub
                    end if
                    next       
                end if

                nPos = InstrB(nPosEnd, biData, CByteString("Content-Type:"))
                nPosBegin = nPos + 14
                nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(13)))
               
                oUploadFile.ContentType = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
               
                nPosBegin = nPosEnd+4
                nPosEnd = InstrB(nPosBegin, biData, vDataBounds) - 2
                oUploadFile.FileData = MidB(biData, nPosBegin, nPosEnd-nPosBegin)
               
                If oUploadFile.FileSize > 0 Then Files.Add LCase(sInputName), oUploadFile
            else
                nPos = InstrB(nPos, biData, CByteString(Chr(13)))
                nPosBegin = nPos + 4
                nPosEnd = InstrB(nPosBegin, biData, vDataBounds) - 2
                If Not mcolFormElem.Exists(LCase(sInputName)) Then mcolFormElem.Add LCase(sInputName), CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
            end if

            nDataBoundPos = InstrB(nDataBoundPos + LenB(vDataBounds), biData, vDataBounds)
        Loop
    End Sub

    'String to byte string conversion
    Private Function CByteString(sString)
        Dim nIndex
        For nIndex = 1 to Len(sString)
          CByteString = CByteString & ChrB(AscB(Mid(sString,nIndex,1)))
        Next
    End Function

    'Byte string to string conversion
    Private Function CWideString(bsString)
        Dim nIndex
        CWideString =""
        For nIndex = 1 to LenB(bsString)
          CWideString = CWideString & Chr(AscB(MidB(bsString,nIndex,1)))
        Next
    End Function
end Class

class UploadedFile

    Public ContentType
    Public FileName
    Public FileData
   
    Public Property Get FileSize()
        FileSize = LenB(FileData)
    End Property

    Public Sub SaveToDisk(sPath)
        Dim oFS, oFile
        Dim nIndex
   
        If sPath = "" Or FileName = "" Then Exit Sub
        If Mid(sPath, Len(sPath)) <> "\" Then sPath = sPath & "\"
           
        Set oFS = Server.CreateObject("Scripting.FileSystemObject")
        'If Not oFS.FolderExists(sPath) Then Exit Sub
        If Not oFS.FolderExists(sPath) Then oFS.CreateFolder(sPath)
       
        Set oFile = oFS.CreateTextFile(sPath & FileName, True)
       
        For nIndex = 1 to LenB(FileData)
            oFile.Write Chr(AscB(MidB(FileData,nIndex,1)))
        Next

        oFile.Close
        set oFS = nothing
    End Sub
   
    Public Sub SaveToDatabase(ByRef oField)
        If LenB(FileData) = 0 Then Exit Sub
       
        If IsObject(oField) Then
            oField.AppendChunk FileData
        End If
    End Sub

end Class

function upload_files(target_dir, filename)

    ''' create the FileUploader
    dim uploader, file
    set uploader = new FileUploader

    ' this starts the upload process
    uploader.Upload()
   
    'response.Write "<b>Thank you for your upload " & uploader.form("fullname") & "</b><br>"

    ' check if any files were uploaded
    if uploader.files.count = 0 then
       
        upload_files = 0

    else
   
        ' loop through the uploaded files
        for each file in Uploader.files.items
       
            ' save the file
            'file.FileName = filename
            file.SaveToDisk target_dir
            if filename = "" then last_filename = Right(file.FileName, Len(file.FileName)-InStrRev(file.FileName, "\"))
           
   
            ' output the file details to the browser
            'response.Write target_dir
            'response.Write file.FileName & "<br>"
            'response.Write "Size: " & file.FileSize & " bytes<br>"
            'response.Write "Type: " & file.ContentType & "<br><br>"
        next
       
        upload_files = uploader.files.count
   
    end if

end function

function delete_file(filename)

    set oFS = Server.CreateObject("Scripting.FileSystemObject")
    if oFS.FileExists(filename) then
        oFS.DeleteFile(filename)
        delete_file = 1
    else
        delete_file = 0
    end if
    set oFS = NOTHING
   
end function
%>
Avatar billede keysersoze Guru
29. maj 2009 - 07:27 #1
det mest nærliggende er, at grænsen ligger på webhotellet - fra windows server 2003 er der i opsætningen en grænse på som standard 200kb og skal denne ændres sker det i AspMaxRequestEntityAllowed i MetaBase. Dette er altså ikke noget du selv kan ændre men noget der skal ske på webhotellet.
Avatar billede softspot Forsker
29. maj 2009 - 08:42 #2
Min umiddelbare tanke var, at det havde noget med scripttimeout at gøre, men det kan da godt være keysersoze har fat i noget der (endnu en indstilling som jeg ikke kendte til :-)).

Har du tjekket at din upload fejler ved 300 Kb på andre linier, eller er det kun testet på én linie?

Prøv evt. at justere scripttimeout til noget højere, f.eks. 300 for at sætte den til 5 minutter og se om det gør nogen forskel overhovedet... jeg mener den ligger på server-objektet

Server.ScriptTimeout = 300
Avatar billede mjdigital Nybegynder
29. maj 2009 - 18:54 #3
a55830 hvis det er ASP.net vi snakker om kan du sætte det i din web.config fil


<httpRuntime  maxRequestLength="ANTAL" executionTimeout="360"/>
Avatar billede thesurfer Nybegynder
02. juni 2009 - 14:46 #4
a55830> Det er en dårlig ide at vælge hvad man IKKE må uploade, som man gør her:

aProhibit = array("asp","exe","php","aspx","asa","cgi","htm","html")

Hvis der kommer flere farlige filtyper, skal du opdatere koden. Men det kræver at du kender til fremtidige farlige filtyper.

I stedet ville det være en god ide, at fortælle scriptet hvad man MÅ uploade, f.eks.:

aAllowed = array("jpg","htm","gif")

osv..


Så vidt jeg ved, er det kun Internet Explorer der er så hjernedød, at den faktisk afvikler JavaScript kode, der er gemt i en fil af typen "JPG" (sikkert også alle andre billedeformater)..
Ja, du læse rigtigt.. hvis du skriver noget JavaScript kode, f.eks. noget med XMLHTTP, og gemmer filen som "test.jpg", vil JavaScript-delen blive afviklet i Internet Explorer.. jeg ved ikke om det også virker i IE7 og IE8..

Med XMLHTTP kan man lave URL-request, hvilket betyder at man kan stjæle brugerens cookies, ved at sende indholdet til en anden adresse..
Typisk Microsoft..
Avatar billede thesurfer Nybegynder
02. juni 2009 - 14:48 #5
PS: Jeg er naturligvis klar over at du højst sandsynlig ikke har skrevet upload-scriptet..

Men det er her der checkes om filtypen er tilladt:


                    for x = 0 to uBound(aProhibit)
                    if inStr(right(lcase(oUploadFile.FileName),4),aProhibit(x))>0 then
                        b_error = true
                        exit sub
                    end if
                    next
Avatar billede a55830 Praktikant
04. juni 2009 - 10:57 #6
wow , jeg takker for de fine indput , jeg har faktisk min egen 2003 server og kan ændre alt det jeg vil i den.

jeg har testet med upload af filer på LAN og over internettet men den fejler inden for 30milisek det er nok keysersoze der har ret men  hvordan ændre jeg det og hvor ?????
Avatar billede a55830 Praktikant
04. juni 2009 - 16:55 #7
fandt selv ud af hvilken fil der skulle ændres og hvordan man gjorde det men keysersoze smid lige et svar for du ramte hovdet på sømmet klokkerent 1000 tak

link til side med guide
http://forums.aspfree.com/microsoft-iis-12/aspmaxrequestentityallowed-increasing-the-value-in-iis-6-0t-129770.html
Avatar billede keysersoze Guru
04. juni 2009 - 17:31 #8
jamen, så lægger jeg da et svar :)
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
Kurser inden for grundlæggende programmering

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