Avatar billede cronck Nybegynder
17. april 2004 - 22:56 Der er 27 kommentarer og
1 løsning

"Avanceret" Upload i ASP, og add til DB

Hej eksperter!
Jeg har en formular som tilføjer en masse data til en DB,
og nu beder jeg en af jer om at hjælpe mig med at tilføje
en upload af .jpg i samme formular. Når man sender oplysningerne
skal filen bliver lagt i \img\items\ med det samme filnavn som
Request.Form("strname") bortset fra at mellemrum skal være
underscroll. Når filerne er blevet lagt ind i databasen, skal
den tilføje det fulde filnavn for eks. "image.jpg" i tabellen
tbl_items under picture

Nogen der kan klare det?

http://frip.dk/cronck/wwwroot.rar
Avatar billede cronck Nybegynder
17. april 2004 - 23:11 #1
Jeg kan hurtigt implentere det her: http://activedeveloper.dk/artikler/default.asp?articleid=107
Men det gemmer jo ikk filen... :(
Avatar billede keysersoze Ekspert
17. april 2004 - 23:25 #2
Det klart letteste og også mest optimale rent performancemæssigt vil være hvis du kan benytte et upload-komponent - prøv at se om ikke webhotellet understøtter fx aspupload eller aspsmartupload som begge har gode eksempler på det du skal i gang med
Avatar billede cronck Nybegynder
17. april 2004 - 23:30 #3
Ved det ikk... Bruger frip.dk
Avatar billede cronck Nybegynder
17. april 2004 - 23:31 #4
Men det bedste ville nok være en komponent-fri løsning, da jeg regner med at købe et domæne senere, om dem får man vel ikk bare sån' lige til at lægge sådan noget ind?
Avatar billede cronck Nybegynder
17. april 2004 - 23:46 #5
keysersoze, http://www.starthotel.dk/ og http://www.web10.dk/ er der nogen af dem som understøtter de komponenter?
Avatar billede keysersoze Ekspert
18. april 2004 - 09:26 #6
web10 har i hvert fald aspupload - jeg kan ikke lige se hvad de har på starthotel
Avatar billede cronck Nybegynder
18. april 2004 - 14:12 #7
k... Men jeg tror faktisk at jeg har fundet en komponent-fri løsning.... skriver senere
Avatar billede vbcoder Nybegynder
18. april 2004 - 17:22 #8
Jeg bruger flg. kode som komponentfri upload

<%
'-------------------- Start: fileupload.inc --------------------

Function FileUpload(strPath, intMaxSize, arrAcceptType, arrAcceptExt, ByRef strContentType, ByRef strFilename, ByRef intFileTotalBytes)
    'Variable deklaration
    Dim intPostTotalBytes, intStartPos, intEndPos, i
    Dim bstrPostData, bstrDivider
    Dim strTemp, strFileSpec
    Dim arrSplit
    Dim vbCrLfB
    Dim bolStopLoop, bolContentTypeOK, bolExtOK
    Dim fs, ts, f

    'Sæt returværdier
    strContentType = ""
    strFilename = ""
    intFileTotalBytes = 0

    'Check: Er det faktisk POST upload?
    If Request.ServerVariables("REQUEST_METHOD") = "POST" Then

        'Dan vbCrLf som binær streng
        vbCrLfB = ChrB(13) & ChrB(10)

        'Hent den binære POST fra brugeren
        intPostTotalBytes = Request.TotalBytes 'Find antallet af bytes i POST
        bstrPostData = Request.BinaryRead(intPostTotalBytes) 'Hent POST til en binær streng
        If LenB(bstrPostData) <> intPostTotalBytes Then 'Check: Er antallet af bytes i POST forskelligt fra den binære streng?
            'Returner værdi og stop
            FileUpload = 1
            Exit Function
        End If

        'Hent delelinien inkl. vbCrLfB (altid hele første linje)
        bstrDivider = LeftB(bstrPostData, InStrB(bstrPostData, vbCrLfB) + 1)

        'Default StartPos
        intStartPos = 1
     
        'Find Content-Disposition hvor name="fileupload"
        bolStopLoop = False
        Do
            'Find starten af denne Content del (umiddelbart efter delelinien)
            intStartPos = InStrB(intStartPos, bstrPostData, bstrDivider) + LenB(bstrDivider)
            If intStartPos = 0 Then
                'Ikke flere Content delere - Returner værdi og stop
                FileUpload = 2
                Exit Function
            End If

            'Find slutningen af denne Content del (umiddelbart inden den næste delelinie)
            intEndPos = InStrB(intStartPos, bstrPostData, bstrDivider)
            If intEndPos = 0 Then
                'Ikke flere Content delere - Returner værdi og stop
                FileUpload = 2
                Exit Function
            End If

            'Hent denne Content-Disposition (uden vbCrLf)
            strTemp = bin2str(MidB(bstrPostData, intStartPos, InStrB(intStartPos, bstrPostData, vbCrLfB) - intStartPos))

            'Er fileupload feltet i denne Content-Disposition?
            If InStr(LCase(strTemp), "name=""fileupload""") > 0 Then
                'Stop løkken her
                bolStopLoop = True
            Else
                'Start igen umiddelbart efter denne Content, men før næste divider
                intStartPos = intEndPos
            End If
        Loop Until bolStopLoop

        'Flyt intStartPos til efter Content-Disposition linjen
        intStartPos = intStartPos + Len(strTemp) + 2

        'Ekstrakt POST filnavnet fra strTemp
        arrSplit = Split(strTemp, ";") 'Opdel strTemp ved ;: Content-Disposition: form-data; name="fileupload"; filename="filen.txt"

        'Find filnavnet fra filename= array
        strTemp = "" 'Værdi ved fejl
        For i = 0 To UBound(arrSplit) 'Køres for alle i denne array
            If LCase(Left(Trim(arrSplit(i)), 9)) = "filename=" Then 'Står der filename= ?
                strTemp = Trim(arrSplit(i))
                Exit For
            End If
        Next

        'Afbryd hvis der ikke blev fundet noget filnavn
        If strTemp = "" Or strTemp = "filename=""""" Then
            FileUpload = 3
            Exit Function
        End If

        'Find filnavnet
        arrSplit = Split(strTemp, """")        'Opdel streng ved "
        strTemp = arrSplit(UBound(arrSplit) - 1) 'Næstsidste indholder filnavn
        arrSplit = Split(strTemp, "\") 'Del ved alle \  Så indeholder den sidste filnavn.ext"
        strFilename = arrSplit(UBound(arrSplit)) 'Hent den sidste array, der må være filnavnet

        'Dan det fulde outputfilnavn via MapPath
        strFileSpec = Server.MapPath(LCase(strPath & strFilename)) 'LCase kan evt fjernes herfra

        'Hent Content-Type (uden vbCrLf)
        strTemp = bin2str(MidB(bstrPostData, intStartPos, InStrB(intStartPos, bstrPostData, vbCrLfB) - intStartPos))

        'Flyt intStartPos til efter Content-Type linjen
        intStartPos = intStartPos + Len(strTemp) + 2
       
        'Ekstrakt POST Content-Type
        arrSplit = Split(strTemp, " ")
        strContentType = arrSplit(UBound(arrSplit))

        'Skal Content-Type checkes?
        bolContentTypeOK = False
        If arrAcceptType(LBound(arrAcceptType)) <> "" Then
            For Each strTemp In arrAcceptType
                If strContentType = strTemp Then
                    bolContentTypeOK = True
                End If
            Next

            'Check: Er det en accepteret Content-Type?
            If Not bolContentTypeOK Then
                'ContentType ikke fundet - Returner værdi og stop
                FileUpload = 4
                Exit Function
            End If
        End If

        'Skal ekstention checkes?
        bolExtOK = False
        If arrAcceptExt(LBound(arrAcceptExt)) <> "" Then
            For Each strTemp In arrAcceptExt
                If LCase(Right(strFilename, Len(strTemp))) = strTemp Then
                    bolExtOK = True
                End If
            Next

            'Check: Er det en accepteret ekstention?
            If Not bolExtOK Then
                'Ekstention ikke fundet - Returner værdi og stop
                FileUpload = 5
                Exit Function
            End If
        End If

        'Find faktiske start/slut på datafilen ved at fjerne foranstillede og efterstillede vbCrLfB
        intStartPos = intStartPos + 2
        intEndPos = intEndPos - 2
        intFileTotalBytes = intEndPos - intStartPos

        'Skal filstørrelsen checkes?
        If intMaxSize > 0 Then
            'Check: Er filen for stor?
            If intFileTotalBytes > intMaxSize Then
                'Filen er for stor - Returner værdi og stop
                FileUpload = 6
                Exit Function
            End If
        End If

        'Åbn, skriv og luk outputfilen
        Set fs = CreateObject("Scripting.FileSystemObject") 'Filsystem objekt
        Set ts = fs.CreateTextFile(strFileSpec, True) 'Åbn outputfil, overskriv evt. eksisterende
        For i = intStartPos To intEndPos - 1
            ts.Write(Chr(AscB(MidB(bstrPostData, i, 1)))) 'Skriv data eet tegn af gangen
        Next
        ts.Close 'Luk outputfil

        'Check: Blev filen oprettet og har den samme størrelse?
        Set f = fs.GetFile(strFileSpec)
        If f.Size <> intFileTotalBytes Then
                FileUpload = 7
                Exit Function
        End If

        '* Returner OK
        FileUpload = 0
    End If
End Function

'* Funktion der oversætter en bstr binær streng til en almindelig streng
'* Pas på med 00 værdier, da de fungerer som EOF i en almindelig streng
Function bin2str(bstrBinary)
    Dim i
    For i = 1 To LenB(bstrBinary)
      bin2str = bin2str & Chr(AscB(MidB(bstrBinary, i, 1)))
    Next
End Function

'-------------------- Slut: fileupload.inc --------------------
%>

Og så denne kode til selve upload - husk at <!-- #include file = "fileupload.inc" -->

<%
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then %>
    Dim intFileUpload, strContentType, strFilename, intFileTotalBytes
    intFileUpload = FileUpload(stitilmappenbil2, 1000000, Array("image/gif", "image/jpeg", "image/pjpeg"), Array("gif", "jpg"), strContentType, strFilename, intFileTotalBytes)
    If intFileUpload = 0 Then
    %>
        Filen <b><%=strFilename%></b> blev uploaded.<br>
        <IMG SRC="<%=stitilmappenbil2%><%=strFilename%>"><br>
    <%
    else
    %>
        <b>Der opstod en fejl under upload!</b><BR>
        Fejl nr: <%=intFileUpload%><BR>
        Filnavn: <%=strFilename%><BR>
        Filtype: <%=strContentType%><BR>
        Filstørrelse: <%=intFileTotalBytes/1024%> kb. (Må kke være over 200 kb.)<BR>
    <%
    End If
End if
%>
Avatar billede vbcoder Nybegynder
18. april 2004 - 17:24 #9
Men under alle omstændigheder kræver koden skriverettigheder et eller andet sted på serveren - typisk i database mappen
Avatar billede cronck Nybegynder
18. april 2004 - 19:15 #10
man har vel automatisk skrive-rettigheder i sin egen mappe på serveren?
Avatar billede keysersoze Ekspert
18. april 2004 - 20:12 #11
nej. der er forskel på rettighederne om du kommer ind via ftp eller web - på ftp har du adgang til alt hvorimod fra web kan der være rettigheder til nogle bestemte mapper og fra serveren (fx ved kørsel af filer) kan der også være bestemte rettigheder.

Det er korrekt at der findes en del "upload uden komponent"-scripts - men der er langsommere og tungere end et "rigtigt" uploadscript
Avatar billede vbcoder Nybegynder
18. april 2004 - 20:26 #12
tja - hvis du tester ovenstående vil du se at de nok kommer på højde med diverse upload komponenter
Avatar billede keysersoze Ekspert
18. april 2004 - 20:37 #13
jeg siger ikke det er dårligt :) Men jeg ville til enhver en tid bruge et komponent hvis jeg kunne ;)
Avatar billede cronck Nybegynder
18. april 2004 - 22:14 #14
vbcoder, tror du at du kan flette det script ind i mit, så det virker som jeg ønsker?
http://frip.dk/cronck/wwwroot.rar
Avatar billede cronck Nybegynder
18. april 2004 - 22:26 #15
Nogen der kan?
Avatar billede cronck Nybegynder
18. april 2004 - 22:35 #16
Jeg har osse lagt et andet upload script i .rar pakken...
Avatar billede vbcoder Nybegynder
19. april 2004 - 07:18 #17
kigger på i aften
Avatar billede cronck Nybegynder
20. april 2004 - 00:06 #18
Er det ikk ved at være lidt sent nu?
Well... Jeg er online den næste times tid..
Avatar billede vbcoder Nybegynder
20. april 2004 - 08:38 #19
Havde lige andre ting ;-)
Avatar billede vbcoder Nybegynder
20. april 2004 - 09:08 #20
er ved det
Avatar billede vbcoder Nybegynder
20. april 2004 - 11:36 #21
jeg har kigget på det og med den måde du beskriver du vil have det skal man bruge et upload komponent, men med en ekstra fil hvor billedet vælges kan det lade sig gøre.

I forhold til ovenstående kode er der ændret i fileupload.asp og på visualcoder.dk/eksperten/490418/add_item.asp kan du teste det

koden ligger indbygget i din kode ligger her

visualcoder.dk/eksperten/490418/490418.zip

jeg vil dog anbefale dig at lave noget fejl check for dine inputs ;-) ellers brokker sql'en sig når data skal gemmes men det ved du vel
Avatar billede cronck Nybegynder
20. april 2004 - 20:43 #22
Citat: "jeg vil dog anbefale dig at lave noget fejl check for dine inputs ;-) ellers brokker sql'en sig når data skal gemmes men det ved du vel"
Yup... ;-)

Det virker da helt perfekt? bortset fra at den ikke laver _ i fil-navnet, men det er ok.. :D

Tusind tak for hjælpen!
Indsend svar... ;)
Avatar billede cronck Nybegynder
20. april 2004 - 20:47 #23
Hvilke Upload komponenter snakker du egentlig om?
Og hvor får jeg dem? Kan de installeres når jeg har IIS?
Avatar billede vbcoder Nybegynder
21. april 2004 - 06:44 #24
Det med underscore er nemt at rette

du i add_item.asp denne kode

--snip
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then
    session("imageDirectory") = "./img/items/"
    session("strName")=request.form("strName")
--snip

ret linjen

session("strName")=request.form("strName")

til

session("strName") = replace(request.form("strName"), " ", "_")

Mht upload komponenter så findes der forskellige f.x.

aspSmartUpload og w3Upload - sådan lige nogen jeg kan komme i tanke om og ja det er noget man kan installerer på iis.

w3Upload kan håndtere upload af filer sammen med andre form data.
Avatar billede vbcoder Nybegynder
21. april 2004 - 06:46 #25
og det kan aspupload også - jeg har vist lavet noget for en engang med den
Avatar billede vbcoder Nybegynder
21. april 2004 - 06:47 #26
jeg havde godt set den der med - mellemrum skal være underscroll - men forstod ikke lige at du faktisk mente underscore :o)
Avatar billede cronck Nybegynder
21. april 2004 - 13:28 #27
Hehe ok... Takker for hjælpen
Avatar billede cronck Nybegynder
27. april 2004 - 21:27 #28
hvor kan jeg hente ASPUpload, og hvordan installerer jeg det på IIS?
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