SharePoint 2007 & Event Receivers

Med SharePoint 2007 så får vi en bättre modell för att hantera händelser i SharePoint. Vi kan fånga events på alla nivåer, från site/web ner till unika radelement (list items). Ser man till event-modellen så jobbar man med före och efter att man utfört en operation på exempelvis en lista.

Tänker vi oss att jag lägger till en bild till en Picture List så kommer event:et ”ItemAdding” att triggas innan själva bilden läggs till listan. Nu har jag möjligheten att ändra egenskaper på denna bild. Allt sker synkront vilket innebär att när bilden läggs in i listan så kommer de förändringar jag gjort på objektet att slå igenom. Efter detta kommer event:et ”ItemAdded” att triggas och jag kan efterbehandla objektet. Allt detta sker asynkront vilket gör att bilden finns i listan och kan användas i detta skede.

På ”Innovation Day: SharePoint 2007” så demonstrerade jag hur man kan i event:et ”ItemAdded” i en Picture List skala om bilden till olika storlekar och lägga till dessa till listan. Koden återfinns nedan.

public override void ItemAdded(SPItemEventProperties properties)
{
// We don't want an infinite loop
this.DisableEventFiring();

SPFile f = properties.ListItem.File;

string filename = f.Name;
filename = filename.Substring(0, filename.LastIndexOf("."));

byte[] srcFile = f.OpenBinary();

SPWeb site = new SPSite(properties.SiteId).OpenWeb(properties.RelativeWebUrl);
SPList list = site.Lists[properties.ListTitle];
SPFolder folder = list.RootFolder;

byte[] resizedImage = ImageResize(srcFile, 100);

folder.Files.Add(filename + "_small.jpg", resizedImage);

resizedImage = ImageResize(srcFile, 200);

folder.Files.Add(filename + "_medium.jpg", resizedImage);

folder.Update();
}

private byte[] ImageResize(byte[] byteArray, int targetSize)
{
Image original = Image.FromStream(new MemoryStream(byteArray));

int targetH, targetW;
if (original.Height > original.Width)
{
targetH = targetSize;
targetW = (int)(original.Width * ((float)targetSize / (float)original.Height));
}
else
{
targetW = targetSize;
targetH = (int)(original.Height * ((float)targetSize / (float)original.Width));
}

Image imgPhoto = Image.FromStream(new MemoryStream(byteArray));

// Create a new blank canvas. The resized image will be drawn on this canvas.
Bitmap bmPhoto = new Bitmap(targetW, targetH, PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(72, 72);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
grPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality;
grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH), 0, 0, original.Width, original.Height, GraphicsUnit.Pixel);

// Save out to memory and then to a file. We dispose of all objects to make sure the files don't stay locked.
MemoryStream mm = new MemoryStream();
bmPhoto.Save(mm, System.Drawing.Imaging.ImageFormat.Jpeg);
original.Dispose();
imgPhoto.Dispose();
bmPhoto.Dispose();
grPhoto.Dispose();

return mm.GetBuffer();
}