Vi söker efter ett bra sätt att kunna ladda upp flera filer samtidigt till en server. Innan har jag bara hört talas om att det går att göra med komponenter i Java, men nu har jag fått ett nytt tips som verkar väldigt lovande.
Per-Mattias på Paltkoma tipsar om att de själva använder SWFUpload till filuppladdning. Har kollat in demot och det verkar riktigt trevligt.
Det handlar alltså om flash och javascript-baserad uppladdning som visar progress-bar för varje fil man valt. Ifall inte flash finns tillgängligt hos användaren visas istället en klassisk uppladdare i html. SWFUpload är utvecklat av Mammon.
Vi kör ett litet torsdagstema med bildbehandling. Skrev för ett tag sen lite kortfattat om hur man kan ladda upp filer med ASP.NET. Ser att det ramlar in en hel del folk genom sökningar så tänkte gå vidare på ämnet.
Nu tänkte jag bjuda på en till mesta del hemmasnickrad klass för att ladda upp och förminska bilder till servern. Kvaliteten blir ibland inte perfekt så denna funktion passar bäst till att skapa mindre tumnaglar.
Sen har jag även märkt att röda nyanser blir något flammiga ibland. Själva funktionen "CreateThumbnail" har inte jag skrivit men har haft den så länge att jag glömt bort var den kommer från. Om någon har en bättre lösning som ger bättre resultat är jag mycket intresserad. Annars kanske det få bli en djupdykning i källkoden för gratisprogrammet Paint.NET i jakt på bätte förminskningsfunktioner.
Men nu till exemplet. Ber om ursäkt för dålig dokumentation och en blandad kompott på svenska och engelska. Använd den precis som du vill. Jag uppskattar länkar tillbaks och även om du gör några framsteg på bildkvaliteten.
Så här anropar man klassen:
if (fu.HasFile) { Trace.Write("We found a image to upload"); HttpPostedFile userPostedFile = fu.PostedFile; ImageUploader imageUploader = new ImageUploader("C:/sökväg/på/server/", userPostedFile, "Namnpåbild.jpg"); //Utlämna mått för att behålla orginalstorlek på bilden imageUploader.IntMaxWidth = 150; imageUploader.IntMaxHeight = 50; bool boolStatus = imageUploader.UploadImage(); if(boolStatus) Trace.Write("Image uploaded!"); }
Och här är själva klassen:
using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Drawing; using System.Drawing.Imaging;
/// <summary> /// Summary description for ImageUploader /// </summary> public class ImageUploader : Page {
//Properties public string StrRootPath { get { return strRootPath; } set { strRootPath = value; } } public string StrImageName { get { return strImageName; } set { strImageName = value; } } public int IntMaxWidth { get { return intMaxWidth; } set { intMaxWidth = value; } } public int IntMaxHeight { get { return intMaxHeight; } set { intMaxHeight = value; } }
//I första konstruktorn använder vi filens orginalnamn public ImageUploader(string StrRootPath,HttpPostedFile UserPostedFile) { strRootPath = StrRootPath; userPostedFile = UserPostedFile; //Ta bort eventuell filändelse strImageName = userPostedFile.FileName.Remove(userPostedFile.FileName.LastIndexOf(".")); //UploadImage(userPostedFile); } //I den utökade så skickar vi med ett eget filnamn public ImageUploader(string StrRootPath,HttpPostedFile UserPostedFile,string StrImageName) { strRootPath = StrRootPath; userPostedFile = UserPostedFile;
//Förminska om den är för stor, och ladda upp if (tooHigh || tooWide) { Trace.Write("tooBig!!"); //Skapa liten automagiskt double photoWidth, photoHeight; double percentageDifference = 0;
//Kolla vad det är för format ImageFormat imageFormat = outputBitMap.RawFormat;
//Spara bilden outputBitMap.Save(@"" + strRootPath + strImageName, imageFormat); uploaded = true; } //Ladda upp orginalbilden om den är inom måtten else { Trace.Write("Rätt storlek eller mindre.");
//Tar emot en BitMap och gör den mindre public static Bitmap CreateThumbnail(Bitmap loBMP, int lnWidth, int lnHeight) { System.Drawing.Bitmap bmpOut = null;
try {
ImageFormat loFormat = loBMP.RawFormat; decimal lnRatio; int lnNewWidth = 0; int lnNewHeight = 0;
//Om bilden är större än en thumbnail, returnera den. if (loBMP.Width < lnWidth && loBMP.Height < lnHeight) return loBMP;