Flera gånger har tanken slagit mig att det vore bra om man kunde skapa filer från flash för användaren att antingen spara ner lokalt eller mot serverytan att senare använda. Detta går ju inte riktigt att göra i Flash som du säkert vet. Det går säkert att lösa med Air och det går att lösa med tredjepartsprogram om man kör en projektorfil, men inte på webben.
Just nu sitter jag i ett projekt där användaren sätter ihop en komposition av många bilder. Kompositionen ska sedan användas på flera olika sätt. Den ska kunna:
- Skrivas ut
- Sparas på servern som jpg och pdf för nedladdning
- Skickas med e-post (i ett led där en bild först måste spara ner för att kunna skickas)
Nödvändiga klasser
I Flash har vi BitmapData som har många användningsområden, vi har också ByteArray för att optimera läsning, skrivning och arbete med binära data. Dessa två klasser är mycket användbara när man behöver skapa en bild. Men så behöver man några fler komponenter också. För att så mycket arbete som möjligt skall utföras av Flash så behöver man:
- Jpg encoder/decoder: http://code.google.com/p/as3corelib/ (läs nedan)
- Base64 encoder/decoder (Inte nödvändig, men behövs i mitt exempel): http://dynamicflash.com/goodies/base64/
Thibault Imbert har skrivit om JPGEncoder klassen att istället för att använda array, använda Vector, vilket har snabbat upp processen upp till TRE GÅNGER. Shit, great job Thibault! Den nya klassen heter JPEGEncoder och laddas hem från länken ovan. OBS! Vector är nytt (en striktare typ av array) och kräver kompilering för flash player 10 och kommer alltså inte att funka om du sitter i Adobe Flash CS3.
Jag har använt mig av en WebService för .NET (skriven av Calle Mowday, http://doc.mowday.se) för att föra över bildens data till servern men det går att göra på många andra sätt.
Hur göra?
Nu har vi en sträng som innehåller all data som behövs för att skapa en jpg-bild och den är redo att skickas till servern.
Och på servern
Sedan kan vi ta emot det på servern. I php kan man lösa det så här (fast då behövs inte Base64 klassen):
I.NET löste vi det genom att skicka en sträng (tStr) som var en Base64 kodad ByteArray till servern som i sin tur konverterar tillbaka och skapar jpg-filen:
Vill man kan man ju också använda den nya klassen FileReference som finns i flash player 10 för att låta användaren spara bilden på sin dator utan att gå via servern, funkar klockrent:















