12. april 2008 - 15:19Der er
11 kommentarer og 2 løsninger
AspJpeg og brug af memory frem for open fra webserver
I nedenstående kode (som fungerer perfekt) kan brugeren uploade et billede til min webserver. Billedet uploades først til serveren, derefter hentes det igen for at blive ændert i størrelse til tre forskellige størrelser. Så uploades de tre billeder til webserveren og det originale billede slettes igen derfra.
Det er smart fordi det virker, men det er IKKE smart, hvis det billeder der loades op fylder f.eks. 1.2 Mb. Først skal det loades op, så skal det hentes tilbage igen og endnu engang loades op tre gange. Det går langsomt på en sløv forbindelse, og brugeren tror ikke der sker noget.
Jeg kan læse mig frem til, at man kan hente billedet lokalt, lægge det i memory, bearbejde det der og efterfølgende uploade det / de bearbejdede billeder til webserveren.
Se det vil jo spare tid, og ikke kræve nogen begrænsning af billedets størrelse.
Mit spørgsmål til 100 point er: Hvordan gør man det, hvad skal ændres eller tilføjes ui nedenstående kode for at gøre det ???
'Sæt de absolutte stier på webserveren til virtuel upload fotoSti = "FJERNET HER PÅ EKSPERTEN" thumbSti = "FJERNET HER PÅ EKSPERTEN" profilSti = "FJERNET HER PÅ EKSPERTEN"
' Opret et instance af AspJpeg objektet Set jpeg = Server.CreateObject("Persits.Jpeg")
' Opret et instance af AspmyUpload objektet Set myUpload = Server.CreateObject("Persits.Upload") myUpload.SetMaxSize 6000000, True
' myUpload først til pic biblioteket på serveren Count = myUpload.SaveVirtual("/upload/pic/")
For Each File in myUpload.Files ' fjern uønskede karakterer i fotonavnet nytNavn = replace(File.FileName," ","",1,-1,1) nytNavn = lCase(nytNavn) nytNavn = replace(nytNavn,"æ","e",1,-1,1) nytNavn = replace(nytNavn,"ø","o",1,-1,1) nytNavn = replace(nytNavn,"å","a",1,-1,1) nytNavn = replace(nytNavn,"%20","",1,-1,1) nytNavn = replace(nytNavn,"%","",1,-1,1) nytNavn = request.Cookies("login")("id")&"__"&nytNavn
' KUN TIL BRUG FOR TEST fotoStr = "<img src='upload/pic/"&nytNavn&"' />" thumbStr = "<img src='upload/thumbnails/"&nytNavn&"' style='border:1px solid black' />" profilStr = "<img src='upload/profiler/"&nytNavn&"' />"
' Åben det myUploadede billede og ændre størrelsen jpeg.Open(File.Path) Jpeg.Interpolation = 2
' Gem i stor størrelse med en bredde på 640 pixel bevar propertioner jpeg.width = 640 Jpeg.Height = Jpeg.OriginalHeight * 640 / Jpeg.OriginalWidth Jpeg.Quality = 90 jpeg.Save (fotoSti&nytNavn)
' Gem i Profil størrelse på 150 x 210 pixel jpeg.width = 150 Jpeg.Height = 210 Jpeg.Quality = 60 jpeg.Save (profilSti&nytNavn)
enten misforstår jeg hvad du skriver - eller også misforstår du hvad der sker.
Der bliver ikke hentet noget frem og tilbage 3 gange - billedet bliver uploadet til filsystemet, det loades én gang og derefter gemt i 3 forskellige størrelser for til sidst at slette originalen.
Set fra klientens internet-hastighed kan du ikke gøre noget hurtigere for det ene billede skal jo uploades - og det er minimalt du kan hente på at lægge det i hukommelsen fremfor i filsystemet for billedet hentes trods alt kun derfra én gang og slettes efterfølgende. De ressourcer du sparer vil næppe kunne måles med det menneskelige øje.
Så overordnet set mener jeg ikke du kan gøre det hurtigere for klienten - men din kode derimod er knap så pæn og det kan på sigt koste, husk at lukke alle objekter du åbner (dvs Scripting.FileSystemObject, Persits.Jpeg og Persits.Upload) og hvis brugeren kun kan uploade ét billede af gangen virker det også forkert at køre det inde i en For-løkke. Endelig kan du måske gøre noget mere ud af det rent brugervenligheds-mæssigt - dvs fx når brugeren klikker på knappen så præsenter en load-screen eller lignende med besked om at det kan tage lidt tid.
Du kunne måske - alternativt - uploade billedet på side 1, hvor du skriver "Billedet er nu uploadet! Det gemmes nu i 3 versioner" eller noget, så brugeren ved, at der sker noget. Og så kan du køre den sidste side, som gemmer de 3.
Det tager så lidt tid at lave de 3 billeder at det - i mine øjne - vil være spild at dele koden op på nogen måde. Det er upload-delen der, set fra brugerens synspunkt, koster.
Jeg er helt med på at alle objekter skla lukkes, det bliver de også, det er bare ikke vist i min kode her, fordi det er en includefil. Objekterne lukkes i hovedfilen.
Men jeg har læst et sted, at man kan oploade billedet man ønsker uplaoded i memory på klientmaskinen, ikke i memory på webserveren.
Det er jo unægtelig noget hurtigere at uploade en billede på 1-2 Mb. fra sin egen harddisk til hukommelsen på sin egen computer, end det er at uploade billedet til webservere.
Det vil så betyde at der i dette tilfælde skulle overføres tre billeder på henholdsvis 45kb. 10 kb. og 2 kb. (ca.) frem for et billede som fylder hvad det nu fylder i sin originale størrelse. Jeg ville så heller ikke skulle slette billedet efterfølgende fra webserveren.
Ellerogså er det som keysersoze skriver fordi, jeg ikke forstår hvordan systemet virker.
Mht lukning af dine objekter så er det godt at du får dem lukket - men bliver det ikke ufatteligt svært at administrere hvis du åbner objektet på én side og lukker på en anden? En dag vælger du at inkludere filen på en anden side og så glemmer du måske at lukke dem på den hovedside - eller også lægger du luk-koden ind i denne fil hvilket så gør at den anden fejler fordi den ikke kan lukke et objekt der allerede er lukket.
ASP (og enhver anden serverside-teknologi) fungerer kun på serveren så manipulering af billeder osv på klienten kan ikke lade sig gøre - hvis du har læst noget andet kunne det da være interessant at få et link til den artikel.
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.