Avatar billede kaptajnknas Nybegynder
27. september 2005 - 23:02 Der er 19 kommentarer og
1 løsning

Begrænsning af upload

Hvordan laver jeg en begrænsning af billede upload, så størrelsen feks. maks er 300 kb?
Og samtidig en validering af filen, så kun jpg accepteres.
Avatar billede keysersoze Ekspert
27. september 2005 - 23:12 #1
hvad benytter du til at uploade med?
Avatar billede kaptajnknas Nybegynder
27. september 2005 - 23:55 #2
ASPupload

Skal du bruge kode?
Avatar billede busschou Praktikant
28. september 2005 - 07:01 #3
jævnfør manualen på www.aspupload.com så skal du benytte "SetMaxSize"
Fx
Upload.SetMaxSize 50000, True
Så må filen max være 50000byte, ordet "True" henviser til at hvis den møder en fil som er større så kaster den en exception, hvis den sættes til False så kommer der ingen exception
Se evt selv manualen
http://www.aspupload.com/manual_simple.html
Avatar billede busschou Praktikant
28. september 2005 - 07:10 #4
hmm jeg ved at aspsmartupload har en funktion hvor man bare fortæller hvilket fil typer som accepteres eller ikke accepteres
Jeg kan ikke rigtig finde tilsvarende funktion i aspuploads manual
Men du kan i hvert fald med File.Ext få filens extension inden du gemmer den
Og så kan du jo manuelt bare lave en if sætning ala
if File.Ext = "jpg" then
  File.SaveAs "c:\billeder\"&name&File.Ext
end if
Avatar billede kaptajnknas Nybegynder
28. september 2005 - 14:56 #5
Jeg må lige undskylde, jeg skrev ASPupload men det er faktisk freeAspUpload og scriptet er vanvittig kompliceret, selve setup filen ser således ud, hvis nogen af jer kan gennemskue det?

<%
Class FreeASPUpload
    Public UploadedFiles
    Public FormElements

    Private VarArrayBinRequest
    Private StreamRequest
    Private uploadedYet

    Private Sub Class_Initialize()
        Set UploadedFiles = Server.CreateObject("Scripting.Dictionary")
        Set FormElements = Server.CreateObject("Scripting.Dictionary")
        Set StreamRequest = Server.CreateObject("ADODB.Stream")
        StreamRequest.Type = 1 'adTypeBinary
        StreamRequest.Open
        uploadedYet = false
    End Sub
   
    Private Sub Class_Terminate()
        If IsObject(UploadedFiles) Then
            UploadedFiles.RemoveAll()
            Set UploadedFiles = Nothing
        End If
        If IsObject(FormElements) Then
            FormElements.RemoveAll()
            Set FormElements = Nothing
        End If
        StreamRequest.Close
        Set StreamRequest = Nothing
    End Sub

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

    Public Property Get Files()
        Files = UploadedFiles.Items
    End Property

    'Calls Upload to extract the data from the binary request and then saves the uploaded files
    Public Sub Save(path)
        Dim streamFile, fileItem

        if Right(path, 1) <> "\" then path = path & "\"

        if not uploadedYet then Upload

        For Each fileItem In UploadedFiles.Items
            Set streamFile = Server.CreateObject("ADODB.Stream")
            streamFile.Type = 1
            streamFile.Open
            StreamRequest.Position=fileItem.Start
            StreamRequest.CopyTo streamFile, fileItem.Length
            streamFile.SaveToFile path & fileItem.FileName, 2
            streamFile.close
            Set streamFile = Nothing
            fileItem.Path = path & fileItem.FileName
        Next
    End Sub

    Public Function SaveBinRequest(path) ' For debugging purposes
        StreamRequest.SaveToFile path & "\debugStream.bin", 2
    End Function

    Public Sub DumpData() 'only works if files are plain text
        Dim i, aKeys, f
        response.write "Form Items:<br>"
        aKeys = FormElements.Keys
        For i = 0 To FormElements.Count -1 ' Iterate the array
            response.write aKeys(i) & " = " & FormElements.Item(aKeys(i)) & "<BR>"
        Next
        response.write "Uploaded Files:<br>"
        For Each f In UploadedFiles.Items
            response.write "Name: " & f.FileName & "<br>"
            response.write "Type: " & f.ContentType & "<br>"
            response.write "Start: " & f.Start & "<br>"
            response.write "Size: " & f.Length & "<br>"
        Next
      End Sub

    Private Sub Upload()
        Dim nCurPos, nDataBoundPos, nLastSepPos
        Dim nPosFile, nPosBound
        Dim sFieldName, osPathSep, auxStr

        'RFC1867 Tokens
        Dim vDataSep
        Dim tNewLine, tDoubleQuotes, tTerm, tFilename, tName, tContentDisp, tContentType
        tNewLine = Byte2String(Chr(13))
        tDoubleQuotes = Byte2String(Chr(34))
        tTerm = Byte2String("--")
        tFilename = Byte2String("filename=""")
        tName = Byte2String("name=""")
        tContentDisp = Byte2String("Content-Disposition")
        tContentType = Byte2String("Content-Type:")

        uploadedYet = true

        on error resume next
        VarArrayBinRequest = Request.BinaryRead(Request.TotalBytes)
        if Err.Number <> 0 then
            response.write "<br><br><B>System reported this error:</B><p>"
            response.write Err.Description & "<p>"
            response.write "The most likely cause for this error is the incorrect setup of AspMaxRequestEntityAllowed in IIS MetaBase. Please see instructions in the <A HREF='http://www.freeaspupload.net/freeaspupload/requirements.asp'>requirements page of freeaspupload.net</A>.<p>"
            Exit Sub
        end if
        on error goto 0 'reset error handling

        nCurPos = FindToken(tNewLine,1) 'Note: nCurPos is 1-based (and so is InstrB, MidB, etc)

        If nCurPos <= 1  Then Exit Sub
       
        'vDataSep is a separator like -----------------------------21763138716045
        vDataSep = MidB(VarArrayBinRequest, 1, nCurPos-1)

        'Start of current separator
        nDataBoundPos = 1

        'Beginning of last line
        nLastSepPos = FindToken(vDataSep & tTerm, 1)

        Do Until nDataBoundPos = nLastSepPos
           
            nCurPos = SkipToken(tContentDisp, nDataBoundPos)
            nCurPos = SkipToken(tName, nCurPos)
            sFieldName = ExtractField(tDoubleQuotes, nCurPos)

            nPosFile = FindToken(tFilename, nCurPos)
            nPosBound = FindToken(vDataSep, nCurPos)
           
            If nPosFile <> 0 And  nPosFile < nPosBound Then
                Dim oUploadFile
                Set oUploadFile = New UploadedFile
               
                nCurPos = SkipToken(tFilename, nCurPos)
                auxStr = ExtractField(tDoubleQuotes, nCurPos)
                ' We are interested only in the name of the file, not the whole path
                ' Path separator is \ in windows, / in UNIX
                ' While IE seems to put the whole pathname in the stream, Mozilla seem to
                ' only put the actual file name, so UNIX paths may be rare. But not impossible.
                osPathSep = "\"
                if InStr(auxStr, osPathSep) = 0 then osPathSep = "/"
                oUploadFile.FileName = Right(auxStr, Len(auxStr)-InStrRev(auxStr, osPathSep))

                if (Len(oUploadFile.FileName) > 0) then 'File field not left empty
                    nCurPos = SkipToken(tContentType, nCurPos)
                   
                    auxStr = ExtractField(tNewLine, nCurPos)
                    ' NN on UNIX puts things like this in the streaa:
                    '    ?? python py type=?? python application/x-python
                    oUploadFile.ContentType = Right(auxStr, Len(auxStr)-InStrRev(auxStr, " "))
                    nCurPos = FindToken(tNewLine, nCurPos) + 4 'skip empty line
                   
                    oUploadFile.Start = nCurPos-1
                    oUploadFile.Length = FindToken(vDataSep, nCurPos) - 2 - nCurPos
                   
                    If oUploadFile.Length > 0 Then UploadedFiles.Add LCase(sFieldName), oUploadFile
                End If
            Else
                Dim nEndOfData
                nCurPos = FindToken(tNewLine, nCurPos) + 4 'skip empty line
                nEndOfData = FindToken(vDataSep, nCurPos) - 2
                If Not FormElements.Exists(LCase(sFieldName)) Then
                    FormElements.Add LCase(sFieldName), String2Byte(MidB(VarArrayBinRequest, nCurPos, nEndOfData-nCurPos))
                else
                    FormElements.Item(LCase(sFieldName))= FormElements.Item(LCase(sFieldName)) & ", " & String2Byte(MidB(VarArrayBinRequest, nCurPos, nEndOfData-nCurPos))
                end if

            End If

            'Advance to next separator
            nDataBoundPos = FindToken(vDataSep, nCurPos)
        Loop
        StreamRequest.Write(VarArrayBinRequest)
    End Sub

    Private Function SkipToken(sToken, nStart)
        SkipToken = InstrB(nStart, VarArrayBinRequest, sToken)
        If SkipToken = 0 then
            Response.write "Error in parsing uploaded binary request."
            Response.End
        end if
        SkipToken = SkipToken + LenB(sToken)
    End Function

    Private Function FindToken(sToken, nStart)
        FindToken = InstrB(nStart, VarArrayBinRequest, sToken)
    End Function

    Private Function ExtractField(sToken, nStart)
        Dim nEnd
        nEnd = InstrB(nStart, VarArrayBinRequest, sToken)
        If nEnd = 0 then
            Response.write "Error in parsing uploaded binary request."
            Response.End
        end if
        ExtractField = String2Byte(MidB(VarArrayBinRequest, nStart, nEnd-nStart))
    End Function

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

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

Class UploadedFile
    Public ContentType
    Public Start
    Public Length
    Public Path
    Private nameOfFile

    ' Need to remove characters that are valid in UNIX, but not in Windows
    Public Property Let FileName(fN)
        nameOfFile = fN
        nameOfFile = SubstNoReg(nameOfFile, "\", "_")
        nameOfFile = SubstNoReg(nameOfFile, "/", "_")
        nameOfFile = SubstNoReg(nameOfFile, ":", "_")
        nameOfFile = SubstNoReg(nameOfFile, "*", "_")
        nameOfFile = SubstNoReg(nameOfFile, "?", "_")
        nameOfFile = SubstNoReg(nameOfFile, """", "_")
        nameOfFile = SubstNoReg(nameOfFile, "<", "_")
        nameOfFile = SubstNoReg(nameOfFile, ">", "_")
        nameOfFile = SubstNoReg(nameOfFile, "|", "_")
    End Property

    Public Property Get FileName()
        FileName = nameOfFile
    End Property

    'Public Property Get FileN()ame
End Class


' Does not depend on RegEx, which is not available on older VBScript
' Is not recursive, which means it will not run out of stack space
Function SubstNoReg(initialStr, oldStr, newStr)
    Dim currentPos, oldStrPos, skip
    If IsNull(initialStr) Or Len(initialStr) = 0 Then
        SubstNoReg = ""
    ElseIf IsNull(oldStr) Or Len(oldStr) = 0 Then
        SubstNoReg = initialStr
    Else
        If IsNull(newStr) Then newStr = ""
        currentPos = 1
        oldStrPos = 0
        SubstNoReg = ""
        skip = Len(oldStr)
        Do While currentPos <= Len(initialStr)
            oldStrPos = InStr(currentPos, initialStr, oldStr)
            If oldStrPos = 0 Then
                SubstNoReg = SubstNoReg & Mid(initialStr, currentPos, Len(initialStr) - currentPos + 1)
                currentPos = Len(initialStr) + 1
            Else
                SubstNoReg = SubstNoReg & Mid(initialStr, currentPos, oldStrPos - currentPos) & newStr
                currentPos = oldStrPos + skip
            End If
        Loop
    End If
End Function
%>
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 08:30 #6
OK - FreeASPUpload er droppet.
Jeg har nu fået installeret ASPUpload og det virker, men 2 ting:

1) Hvordan omdøber jeg et billede?
2) Hvordan sætter jeg begrænsning til kun jpg?
Avatar billede busschou Praktikant
29. september 2005 - 08:37 #7
ja jeg forstod heller ikke meget af det andet script ;o)
Med hensyn til omdøbing så prøv kigge i kapitel tre i manualen, der er eksempler på hvordan du hiver filnavnet ud, og så kan du jo blot erstatte det
Med hensyn til kun jpg, så har jeg stadig ikke noget bedre forslag end som tidligere sagt at finde filens extension og så tjekke om den er "jpg" manuelt, evt som caseinsensitive
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 08:41 #8
Jeg tager lige et kig på det.. vender tilbage evt. med "jpg" tingen. :)
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 09:15 #9
Det går helt i ged for mig.
Det eneste jeg kan få til at virke er et simpel upload til en mappe, men jeg vil gerne kunne uploade det originale billede til en mappe og resize et lille til en anden mappe og begge vil jeg omdøbe inden de gemmes.
Det kan jeg simpelthen ikke få til at virke, enten kan filen ikke findes ellers får jeg andre scriptfejl som "Undtagelse opstod".
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 10:06 #10
Ok, så langt så godt, nu virker det meste for mig, men hvordan får jeg omdøbt filen?

Jeg har prøvet med:
<%
' Check whether a file was selected
Set File = Upload.Files("FILE1")
If Not File Is Nothing Then
  ' Obtain file name
  Filename = file.Filename
%>

Men hvordan??
Avatar billede busschou Praktikant
29. september 2005 - 10:15 #11
du har jo at File.FileName er filens hele navn, og at File.Ext er dens extension
Normalt ville man gøre noget ala
---
File.SaveAs Path & "\" & File.FileName
---
Du kan så gøre noget ala
---
if LCase(File.Ext) = "jpg" then
  File.SaveAs STI_TIL_BILLEDET & "\" & NAVN_PÅ_BILLEDET & ".jpg"
else
  response.write "Forkert type fil benyt kun jpg"
end if
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 10:24 #12
busschou >> validering af filtype virker også fint, men jeg kan absolut ikke omdøbe filen.
Har prøvet denne uden held :(

<%
If Not File Is Nothing Then
File = nytnavn
Filename = File.Filename
end if
%>
Avatar billede busschou Praktikant
29. september 2005 - 10:30 #13
jamen File er jo din fil, altså hele filen og ikke bare navnet!
Så når du skriver File = nytnavn så er File ikke længere en fil men blot et navn
Prøv
Navn = "ditnavn.jpg"
File.SaveAs "c:\blabla\"&navn
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 10:59 #14
Perfekt det virker :-)
Tak for hjælpen.
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 11:36 #15
Må jeg stille dig et enkelt spørgsmål mere?
Med hensyn til billedestørrelse, kan det ændres her:

Jpeg.Open File.Path
  Jpeg.Width =  200
  Jpeg.Height = 180

Men jeg vil gerne kunne sætte breden altså "Jpeg.Width =  200" til 200pix og så at højden bliver sat automatisk - kan det laves?
Avatar billede busschou Praktikant
29. september 2005 - 11:45 #16
tak for points, godt det virker :o)
Med hensyn til størrelsen er det så aspjpeg du benytter ? For så er der følgende eksempel i manualen
----
<%
' Create instance of AspJpeg
Set Jpeg = Server.CreateObject("Persits.Jpeg")

' Open source image
Jpeg.Open "c:\path\myimage.jpg"

' New width
L = 100

' Resize, preserve aspect ratio
Jpeg.Width = L
Jpeg.Height = Jpeg.OriginalHeight * L / Jpeg.OriginalWidth

' create thumbnail and save it to disk
Jpeg.Save "c:\path\thumbnail.jpg"

%>
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 12:09 #17
Meget fint :O)
En aller sidste ting, kan man skrive en kode så billedet ikke gemmes i browserens cachefil?
Avatar billede busschou Praktikant
29. september 2005 - 13:16 #18
øhh bøhh den var værre... jeg ved ikke om der er noget specifikt til billedeuploads
Men du kan jo altid tilføje diverse <meta> tags som angiver no-cache og expires osv, men de afhænger vist igen af browsertypen
Så jeg kan nok ikke vejlede dig vildt meget der desværre
Avatar billede kaptajnknas Nybegynder
29. september 2005 - 13:53 #19
Tjaa.. ellers skulle jeg måske lave noget "getnewID" til hver billede??
Men takker for hjælpen :O)
Avatar billede busschou Praktikant
29. september 2005 - 14:09 #20
jeg ved som sagt ikke så meget om det, og jeg er ikke inde i hvordan browseren cacher
Logisk set vil jeg ikke mene browseren skulle have nogen grund til at cache når du uploader et billede
Grunden til cachen må jo være at man henter noget og derved kan slippe for at hente noget man allerede har hentet
Den anden vej virker ulogisk på mig
Men det er da muligt det er sådan

Håber du finder ud af det:o)
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