24. august 2004 - 19:06Der 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.
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))
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.
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.
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?
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!
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.
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.
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)
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?
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%>">
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.
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)"
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'.
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
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)))
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.
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
... 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.
Synes godt om
Ny brugerNybegynder
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.