Avatar billede grafikeren Nybegynder
24. august 2004 - 19:06 Der er 46 kommentarer og
1 løsning

Filhåntering i asp

Hej!

Jeg mangler lige nogen som er gode til lidt simpel filhåntering i asp.

Baggrund: Jeg har et script, hvor mine brugere kan uploade billedfiler. De kaldes 'session("Brugernavn")&"."&strType' , brugerne skal dog ha' mulighed for at uploade lige så mange billeder, som de lyster.

Opgave: Jeg går ud fra at filerne skal hedder noget med session("Brugernavn")&EtTal&"."&strType

EtTal skal så tælles op skal så starte med 1, ved den første fil. Ved de næste uploads skal den undersøge hvad det største tal er og lægge et til, således at den næste fil hedder brugernavn2, brugernavn3, brugernavn4 og så videre. Det skal selvfølgelig virke selvom brugeren sletter det første (eller andre) billede(r).

For at vise disse billeder igen er det vel lettest at gemme oplysninger om filnavn og dato i en db. Men hvordan håndterer jeg det lettest...!?

Kan det gøres lettere? Jeg skal nok bruge komplette koder/løsninger, jeg har ikke arbejdet så meget med filhåndtering i asp.
Avatar billede eagleeye Praktikant
24. august 2004 - 19:40 #1
Hvis du bruge ASPupload har den mulighed for at man sætte, denne proterty:
Upload.OverwriteFiles = False
Så kommer der automatisk et nummer på hvis filen findes.


Du kan også kode det selv med FSO:
    Set fso = Server.CreateObject("Scripting.FileSystemObject")
    sti = "/images/"
    nytnavn = sti & session("Brugernavn")"."&strType
    i=0
    do while fso.FileExists(Server.MapPath(nytnavn))
      i=i+1
      nytnavn = sti & session("Brugernavn")&i&"."&strType
    loop
    File.SaveAs (Server.MapPath(sti & nytnavn))
Avatar billede cpufan Juniormester
24. august 2004 - 19:44 #2
du kan evt lave en db, der håndterer billedantal.
altså en tabel der holder et brugernavn og et tal.
inden upload tjekkes nuværende tal, og filerne navngives derefter, og db'en opdateres efterfølgende.
Avatar billede grafikeren Nybegynder
24. august 2004 - 20:16 #3
Jeg skulle lige ha' tænkt ideén lidt mere igennem. Jeg er gået i gang med at lave en komplet db, som holder styr på alle billedinformationer. Så kan brugerne også tilføje tekst og lignende. Det er vist den bedste løsning.
Avatar billede eagleeye Praktikant
24. august 2004 - 20:22 #4
Ligemeget hvordan man finde filnavnet kan man jo gemme de endelige filnavn i database, ja så kan man nemlig gemme tekst, størrelse mm. Men hvordan du finder næste nummer er der mange muligheder til.

Vil du havde at den fylder "huller ud" i filnavnet. Hvis en bruger slette filen bruger2 skal den så genbruge bruger2 til en ny fil, også selvom der finden en bruger3 og bruger4 fil?
Avatar billede eagleeye Praktikant
24. august 2004 - 20:24 #5
En sikker metode er til filnavnet er <brugernavn><now> som ikke kræve nogle loops eller opslag i db for at finde filnavnet.
Avatar billede grafikeren Nybegynder
24. august 2004 - 20:42 #6
Jeg har nu lavet en tabel, som gemmer alle billedoplysninger. Desuden gemmer jeg et nummer i den. Den tjekker nu dette nummer inden den skriver filen, og giver den nummeret over. Det virker super!

Hvordan tjekker man størrelsen på en fil?
Avatar billede eagleeye Praktikant
24. august 2004 - 20:50 #7
Nogle upload komponenter kan give højde og brede, hvis ikke kan man få et længere styk kode som bruger FSO til at finde det.
Avatar billede grafikeren Nybegynder
24. august 2004 - 20:58 #8
Der var skrevet en kode til file.size, så den brugte jeg bare. Super. Næste spørgsmål var egentligt om man kan resize et billede, således at den fx får bredden 40 pixels og proportionel højde. Det kunne være lidt smart, når billederne skal vises som små billeder.
Avatar billede eagleeye Praktikant
24. august 2004 - 21:01 #9
Det kræver et billede komponent at resize et billede.
Det mest kente er ASPImage, der findes også ASPSmartImage
Avatar billede grafikeren Nybegynder
24. august 2004 - 21:07 #10
Er det gratis? :o)
Avatar billede grafikeren Nybegynder
24. august 2004 - 21:07 #11
Skal komponenter ikke også installeres hos udbyderen...? Det er lidt øv, når man ikke selv "hoster".
Avatar billede eagleeye Praktikant
24. august 2004 - 21:10 #12
Nej de koster penge og skal installeres på den server koden skal virke på. Har du et web-hotel skal det installeres hos web-hotel, desværre tror jeg ikke der er nogle web-hoteler som vil installere flere komponenter end dem de har valgt.
Avatar billede grafikeren Nybegynder
24. august 2004 - 21:20 #13
Jeg har concor. Kan du se om nogen af deres komponenter kan resize. Det ser ikke sådan ud. http://www.concor.dk/webpages/support/komponenter.asp
Avatar billede eagleeye Praktikant
24. august 2004 - 21:27 #14
Nej der er ikke nogle af dem der kan. Du kan se en liste over forskellige komponenter her:
http://activedeveloper.dk/komponenter/default.asp?mode=kategori&id=9
Avatar billede grafikeren Nybegynder
24. august 2004 - 21:58 #15
Øvøv... Men mange tak for det. Så må jeg bare resize dem til en fast størrelse, det er bare uendeligt grimt! :o)
Avatar billede eagleeye Praktikant
24. august 2004 - 22:01 #16
Ok, men når du siger resize så det "fysisk størrese" og ikke bare visuel størrelse?

Fysisk: Filen går fra 1024x768 (1Mb) og gemmes i ny fil som  512x384 (150kb)
visuel: Filen går fra 1024x768 (1Mb) og vises i browseren som 512x538 (1Mb)
Avatar billede grafikeren Nybegynder
24. august 2004 - 22:05 #17
Det kan vel diskuteres. Jeg ville mene, at det hedder resize (formindske) i begge tilfælde. Men jeg skal bare bruge det visuelt - kan det løses uden komponent?
Avatar billede grafikeren Nybegynder
24. august 2004 - 22:17 #18
Nu har jeg sendt et ekstra form felt (billedtekst) med formen. Jeg kan dog ikke requeste den som sædvantligt inde i den avancerede upload fil.

Den skriver:
"Request object error 'ASP 0207 : 80004005'

Cannot use Request.Form

/grafikeren/hk/UploadModul/Uploadfile.asp, line 93

Cannot use Request.Form collection after calling BinaryRead. "


What to do?
Avatar billede eagleeye Praktikant
24. august 2004 - 22:27 #19
Ja det stryes mev withd og hight i image tagen:
<img src="billede.jpg" width="120" height="120">

Hvis man kender brede og højde på billedet og man har enten width eller hight som fixed kan man find den anden paramter.:

<%
showWidth=billedeWidth

fixedWidth=100
if showWidth>fixedWidth then
  procent=fixedWidth/billedeWidth
  showWidth=fixedWidth
else
  procent=1
end if
showheight=Int(billedeheight*procent)
%>
<img src="billede.jpg" width="<%=showwidth%>" height="<%=shoheight%>">
Avatar billede eagleeye Praktikant
24. august 2004 - 22:38 #20
Når du har brugt BinaryRead kan man ikke også bruge Request.Form.

Er det i forbindelse med ASPSmartUpload?
Avatar billede grafikeren Nybegynder
24. august 2004 - 22:51 #21
Jeg ved ikke rigtig hvad "scriptet" hedder... Det er sat sammen af en jeg kender. Øverst i filerne står der "Author: Jacob "Beezle" Gilley", hvis det siger dig noget. Men hvordan henter jeg så formen med min billed tekst?

hehe, jeg ved godt hvordan man visuelt resizer et billede. :o) Men det skulle bare gerne skaleres. Hvis jeg skal bruge dit fine script, så skal jeg jo ha' mit upload script til at skrive højde og bredte ind i min tabel... Mon den kan det.
Avatar billede grafikeren Nybegynder
24. august 2004 - 23:07 #22
Kan det slet ikke lade sig gøre at sende billed teksten gennem samme form?
Avatar billede eagleeye Praktikant
24. august 2004 - 23:15 #23
dette er en lang kode :)

Dette kode kan du ligge i en .asp fil og evt kalde imgsize.asp Så kan du include den hvor du har behov for det. Koden kan finde højde og brede på et billede ved hjælp af FSO.


Filen  imgsize.asp



<%
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::                                                            :::
  ':::  This routine will attempt to identify any filespec passed  :::
  ':::  as a graphic file (regardless of the extension). This will :::
  ':::  work with BMP, GIF, JPG and PNG files.                    :::
  ':::                                                            :::
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::          Based on ideas presented by David Crowell          :::
  ':::                  (credit where due)                        :::
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  '::: blah blah blah blah blah blah blah blah blah blah blah blah :::
  '::: blah blah blah blah blah blah blah blah blah blah blah blah :::
  '::: blah blah    Copyright *c* MM,  Mike Shaffer    blah blah :::
  '::: blah blah      ALL RIGHTS RESERVED WORLDWIDE      blah blah :::
  '::: blah blah  Permission is granted to use this code blah blah :::
  '::: blah blah  in your projects, as long as this    blah blah :::
  '::: blah blah      copyright notice is included      blah blah :::
  '::: blah blah blah blah blah blah blah blah blah blah blah blah :::
  '::: blah blah blah blah blah blah blah blah blah blah blah blah :::
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::                                                            :::
  ':::  This function gets a specified number of bytes from any    :::
  ':::  file, starting at the offset (base 1)                      :::
  ':::                                                            :::
  ':::  Passed:                                                    :::
  ':::      flnm        => Filespec of file to read              :::
  ':::      offset      => Offset at which to start reading      :::
  ':::      bytes      => How many bytes to read                :::
  ':::                                                            :::
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  function GetBytes(flnm, offset, bytes)

    Dim objFSO
    Dim objFTemp
    Dim objTextStream
    Dim lngSize

    on error resume next

    Set objFSO = CreateObject("Scripting.FileSystemObject")
   
    ' First, we get the filesize
    Set objFTemp = objFSO.GetFile(flnm)
    lngSize = objFTemp.Size
    set objFTemp = nothing

    fsoForReading = 1
    Set objTextStream = objFSO.OpenTextFile(flnm, fsoForReading)

    if offset > 0 then
        strBuff = objTextStream.Read(offset - 1)
    end if

    if bytes = -1 then        ' Get All!

        GetBytes = objTextStream.Read(lngSize)  'ReadAll

    else

        GetBytes = objTextStream.Read(bytes)

    end if

    objTextStream.Close
    set objTextStream = nothing
    set objFSO = nothing

  end function


  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::                                                            :::
  ':::  Functions to convert two bytes to a numeric value (long)  :::
  ':::  (both little-endian and big-endian)                        :::
  ':::                                                            :::
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  function lngConvert(strTemp)
    lngConvert = clng(asc(left(strTemp, 1)) + ((asc(right(strTemp, 1)) * 256)))
  end function

  function lngConvert2(strTemp)
    lngConvert2 = clng(asc(right(strTemp, 1)) + ((asc(left(strTemp, 1)) * 256)))
  end function

 
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::                                                            :::
  ':::  This function does most of the real work. It will attempt  :::
  ':::  to read any file, regardless of the extension, and will    :::
  ':::  identify if it is a graphical image.                      :::
  ':::                                                            :::
  ':::  Passed:                                                    :::
  ':::      flnm        => Filespec of file to read              :::
  ':::      width      => width of image                        :::
  ':::      height      => height of image                        :::
  ':::      depth      => color depth (in number of colors)      :::
  ':::      strImageType=> type of image (e.g. GIF, BMP, etc.)    :::
  ':::                                                            :::
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  function gfxSpex(flnm, width, height, depth, strImageType)

    dim strPNG
    dim strGIF
    dim strBMP
    dim strType
    strType = ""
    strImageType = "(unknown)"

    gfxSpex = False

    strPNG = chr(137) & chr(80) & chr(78)
    strGIF = "GIF"
    strBMP = chr(66) & chr(77)

    strType = GetBytes(flnm, 0, 3)

    if strType = strGIF then                ' is GIF

        strImageType = "GIF"
        Width = lngConvert(GetBytes(flnm, 7, 2))
        Height = lngConvert(GetBytes(flnm, 9, 2))
        Depth = 2 ^ ((asc(GetBytes(flnm, 11, 1)) and 7) + 1)
        gfxSpex = True

    elseif left(strType, 2) = strBMP then        ' is BMP

        strImageType = "BMP"
        Width = lngConvert(GetBytes(flnm, 19, 2))
        Height = lngConvert(GetBytes(flnm, 23, 2))
        Depth = 2 ^ (asc(GetBytes(flnm, 29, 1)))
        gfxSpex = True

    elseif strType = strPNG then            ' Is PNG

        strImageType = "PNG"
        Width = lngConvert2(GetBytes(flnm, 19, 2))
        Height = lngConvert2(GetBytes(flnm, 23, 2))
        Depth = getBytes(flnm, 25, 2)

        select case asc(right(Depth,1))
          case 0
              Depth = 2 ^ (asc(left(Depth, 1)))
              gfxSpex = True
          case 2
              Depth = 2 ^ (asc(left(Depth, 1)) * 3)
              gfxSpex = True
          case 3
              Depth = 2 ^ (asc(left(Depth, 1)))  '8
              gfxSpex = True
          case 4
              Depth = 2 ^ (asc(left(Depth, 1)) * 2)
              gfxSpex = True
          case 6
              Depth = 2 ^ (asc(left(Depth, 1)) * 4)
              gfxSpex = True
          case else
              Depth = -1
        end select


    else

        strBuff = GetBytes(flnm, 0, -1)        ' Get all bytes from file
        lngSize = len(strBuff)
        flgFound = 0

        strTarget = chr(255) & chr(216) & chr(255)
        flgFound = instr(strBuff, strTarget)

        if flgFound = 0 then
          exit function
        end if

        strImageType = "JPG"
        lngPos = flgFound + 2
        ExitLoop = false

        do while ExitLoop = False and lngPos < lngSize

          do while asc(mid(strBuff, lngPos, 1)) = 255 and lngPos < lngSize
              lngPos = lngPos + 1
          loop

          if asc(mid(strBuff, lngPos, 1)) < 192 or asc(mid(strBuff, lngPos, 1)) > 195 then
              lngMarkerSize = lngConvert2(mid(strBuff, lngPos + 1, 2))
              lngPos = lngPos + lngMarkerSize  + 1
          else
              ExitLoop = True
          end if

      loop
      '
      if ExitLoop = False then

          Width = -1
          Height = -1
          Depth = -1

      else

          Height = lngConvert2(mid(strBuff, lngPos + 4, 2))
          Width = lngConvert2(mid(strBuff, lngPos + 6, 2))
          Depth = 2 ^ (asc(mid(strBuff, lngPos + 8, 1)) * 8)
          gfxSpex = True

      end if
                 
    end if

  end function

%>
Avatar billede eagleeye Praktikant
24. august 2004 - 23:16 #24
Når du ønsker størrrelsen kan du bruge denne funktion:

  gfxSpex(Server.Mappath("billede.jpg"), w, h, c, strType
så er breden i w, højden i h
Avatar billede eagleeye Praktikant
24. august 2004 - 23:18 #25
Bruger du din egen upload funktion?
Du har mulighed for ASPSmartUload hos din udbyder.
Avatar billede grafikeren Nybegynder
24. august 2004 - 23:18 #26
Det var sjovt... jeg havde lige fundet den! Hehe. Hvordan er det jeg "snakker" med sådan en funktion. Hvis jeg fx skulle tjekke højden på 'images/peter.jpg'.
Avatar billede grafikeren Nybegynder
24. august 2004 - 23:20 #27
Fin fin. Jeg ved ikke så meget om min upload funktion... Den bruger nok ASPSmartUpload. Ved det faktisk ikke, men det virker. :o)

Mange tak for hjælpen! :o)
Avatar billede grafikeren Nybegynder
24. august 2004 - 23:25 #28
Lige en sidste gang: Kan det slet ikke lade sig gøre at sende billed teksten gennem samme form?
Avatar billede grafikeren Nybegynder
24. august 2004 - 23:36 #29
Der står, at man kan modtage andre form felter ved at bruge: [FileUploader object].Form

Men hvad skal det sige?? Her er det første i upload koden:

<%@ Language=VBScript %>

<%Option Explicit%>

<!-- #include file="upload.asp" -->
<%
'###############################################
'This shows how to access all files in the html element :
'Set Uploader = New FileUploader
'Uploader.Upload()
'For Each File In FileUploader.Files.Items
'    Response.Write "File Name:" & File.FileName
'    Response.Write "File Size:" & File.FileSize
'    Response.Write "File Type:" & File.ContentType
'Next

'This shows how to access file information about a specific file in the html element :
'Response.Write "File Name:" & FileUploader.Files("file1").FileName
'Response.Write "File Size:" & FileUploader.Files("file1").FileSize
'Response.Write "File Type:" & FileUploader.Files("file1").ContentType
'###############################################


'------------------------------------------------

Dim strFolder, bolUpload, strMessage
Dim httpref, lngFileSize
Dim strIncludes, strExcludes, billedtekst

%>
<!-- #include file = "config.asp" -->   
<%

' Create the FileUploader
Dim Uploader, File
Set Uploader = New FileUploader

' This starts the upload process
Uploader.Upload()

'******************************************
' Use [FileUploader object].Form to access
' additional form variables submitted with
' the file upload(s). (used below)
'******************************************
billedtekst = ????
' Check if any files were uploaded
If Uploader.Files.Count = 0 Then
    strMessage = "No file entered."
Else
Avatar billede eagleeye Praktikant
24. august 2004 - 23:37 #30
Jeg kender ikke dit upload script, men bruger man ASPSmartUpload er det let, der bruger man bare Upload.Form isetdet for Request.Form. Bruger du upload uden komponent skal du havde lavet koden så den henter teksten ud.

Noget i stil med sådan her:

strContentDisposition  er data hente med BinaryRead

If InStr(strContentDisposition, "name=""fileupload_dir""") > 0 Then
  strDestinationDir = LCase(bin2str(MidB(bstrPostData, strat_pos, længe)))

Men tag evt et kig på koden her:
http://activedeveloper.dk/download/default.asp?mode=showdownload&id=430

Eller dette:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnasdj01/html/asp0900.asp
Koden kan downloades herfra, det er en bruger fra eksperten:
http://www.cwboy.dk/downloads/
Avatar billede eagleeye Praktikant
24. august 2004 - 23:38 #31
Prøv i setdet for
Request.Form("xxx")

at skrive:

Uploader.Form("xxx")


hvis du kalder dit upload object for Uploader
Avatar billede grafikeren Nybegynder
24. august 2004 - 23:42 #32
Det virker nu med: 'billedtekst = Uploader.Form("billedtekst")'
Avatar billede grafikeren Nybegynder
24. august 2004 - 23:52 #33
Fedt... Hvordan var det jeg skulle bruge den funktion?

gfxSpex(Server.Mappath("../Brugere/Billeder/ole1.jpg"), w, h, c, strType)

Hvad gør jeg galt?
Avatar billede eagleeye Praktikant
24. august 2004 - 23:54 #34
Jo, Hvad melder den af fejl?
Avatar billede grafikeren Nybegynder
24. august 2004 - 23:55 #35
Microsoft VBScript compilation error '800a0414'

Cannot use parentheses when calling a Sub

/grafikeren/hk/UploadModul/copy.asp, line 46

gfxSpex(Server.Mappath("../Brugere/Billeder/ole1.jpg"), w, h, c, strType)
Avatar billede eagleeye Praktikant
25. august 2004 - 00:00 #36
Prøv lige at skrive det som :

gfxSpex Server.Mappath("../Brugere/Billeder/ole1.jpg"), w, h, c, strType
Avatar billede grafikeren Nybegynder
25. august 2004 - 00:06 #37
løsningen var:

if gfxSpex(Server.Mappath("../Brugere/Billeder/ole1.jpg"), w, h, c, strType) = true then
'for en syns skyld
w = w
h = h
end if
Avatar billede grafikeren Nybegynder
25. august 2004 - 00:07 #38
eagleeye -> læg et svar. Tak for hjælpen!
Avatar billede eagleeye Praktikant
25. august 2004 - 00:08 #39
Ok :)
Avatar billede grafikeren Nybegynder
25. august 2004 - 00:12 #40
Min billedviser cacher dog helt vildt! Jeg har ellers lagt følgende kode i toppen:
Response.AddHeader "pragma","no-cache"
Response.AddHeader "cache-control","private"
Response.CacheControl = "no-cache"

Den viser gamle billeder, som ikke længere eksisterer. Det kræver lige en upload. Kan man tvinge den yderligere for ikke at cache.
Avatar billede eagleeye Praktikant
25. august 2004 - 00:16 #41
Eller måske sådan her:

Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
Avatar billede grafikeren Nybegynder
25. august 2004 - 00:23 #42
Det tester jeg lige. Scriptet som finder størrelsen virker dog ikke... ØV! Den viser h x w til 127 x 127 ved alle billeder. Kan du gennemskue fejlen?
Avatar billede eagleeye Praktikant
25. august 2004 - 00:25 #43
Hvis du bruger dette kode:

if gfxSpex(Server.Mappath("../Brugere/Billeder/ole1.jpg"), w, h, c, strType) = true then
'for en syns skyld
w = w
h = h
end if

Er filnavnet bestemt til en bestemt fil.
Avatar billede grafikeren Nybegynder
25. august 2004 - 00:27 #44
Det har jeg rettet. Tjekker dog lige om det ikke meget vel kunne være min tabel, hvis nu variablerne ikke er tal men tekst... Kunne det ikke tænkes? int(w) og int(h) prøver jeg lige
Avatar billede eagleeye Praktikant
25. august 2004 - 00:28 #45
Hmm det underlidt at det er samme tal?
Avatar billede eagleeye Praktikant
25. august 2004 - 00:29 #46
Du har ikke en default værdi for højde og brede på 127?
Avatar billede grafikeren Nybegynder
25. august 2004 - 00:32 #47
... problemet er løst. Det var tabellen... 127 er maks for den type jeg fejlagtigt havde valgt.

Sorry. Nu virker din billed resize også! FEDT! Mange tak og sov godt.
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