Avatar billede natsprinter Nybegynder
12. april 2008 - 15:19 Der 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 ???

************************* KODEN *************************

    '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)
       
        ' Gem thumbnail med målene 70x70 pixel
        jpeg.Width = 70
        jpeg.Height = 70
        Jpeg.Quality = 70
        jpeg.Save (thumbSti&nytNavn)
       
        'Slet den originale fil fra webserveren
        dim objFilSystem
        Set objFilSystem = Server.CreateObject("Scripting.FileSystemObject")

        set slet = objFilSystem.getfile(server.mappath("upload\pic\" & File.FileName))
        slet.delete
next
Avatar billede keysersoze Guru
12. april 2008 - 15:39 #1
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.
Avatar billede w13 Novice
12. april 2008 - 15:42 #2
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.
Avatar billede w13 Novice
12. april 2008 - 15:44 #3
Og så kan du i øvrigt rette:

        'Slet den originale fil fra webserveren
        dim objFilSystem
        Set objFilSystem = Server.CreateObject("Scripting.FileSystemObject")

        set slet = objFilSystem.getfile(server.mappath("upload\pic\" & File.FileName))
        slet.delete

til:

        Server.CreateObject("Scripting.FileSystemObject").getfile(server.mappath("upload\pic\"&File.FileName)).delete

Så har du heller ikke problemet med, at du ikke lukker "slet"-objektet.
Avatar billede w13 Novice
12. april 2008 - 15:45 #4
*Så har du heller ikke problemet med, at du hverken lukker "slet"- eller objFilSystem-objektet.
Avatar billede keysersoze Guru
12. april 2008 - 15:54 #5
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.
Avatar billede w13 Novice
12. april 2008 - 15:57 #6
Hvad angår min rettelse af:

        'Slet den originale fil fra webserveren
        dim objFilSystem
        Set objFilSystem = Server.CreateObject("Scripting.FileSystemObject")

        set slet = objFilSystem.getfile(server.mappath("upload\pic\" & File.FileName))
        slet.delete

så glem den.

Du bør derimod flytte:

        'Slet den originale fil fra webserveren
        dim objFilSystem
        Set objFilSystem = Server.CreateObject("Scripting.FileSystemObject")

op over:

For Each File ...
Avatar billede w13 Novice
12. april 2008 - 15:57 #7
Ellers skal der jo oprettes forbindelse til FileSystemObject for hvert billede.
Avatar billede natsprinter Nybegynder
13. april 2008 - 15:51 #8
Tak for alle indlæg:

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.
Avatar billede keysersoze Guru
13. april 2008 - 17:03 #9
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.
Avatar billede w13 Novice
13. april 2008 - 17:10 #10
Det kunne jeg godt forestille mig, var i Java eller lignende, dvs. - som Keysersoze siger - ikke ServerSide.
Avatar billede natsprinter Nybegynder
13. april 2008 - 22:20 #11
OK - Det er nok det der er at slrive om dette emne - vil i smide nogle svar så jeg kan dele point ud og få lukket døren :-D
Avatar billede keysersoze Guru
13. april 2008 - 22:57 #12
svar :)
Avatar billede w13 Novice
14. april 2008 - 09:35 #13
:)
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



IT-JOB

Capgemini Danmark A/S

Salesforce CTO - Nordics

Unik System Design A/S

People Manager for agile organization

Netcompany A/S

Managing Architect

Staten og Kommunernes Indkøbsservice A/S (SKI)

2nd level IT-supporter