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();
}
Comments
Anonymous
March 28, 2007
Hi Henrik Nice example. Have you ever tried to have several event handlers attached to a list, i.e. to both ItemAdded and ItemUpdated. In this situation it seems that the events are executed simultaneous - leading to quite strange behavior (as I was not expecting this to happen). MortenAnonymous
March 28, 2007
The comment has been removed