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 (2)

  1. marquard says:

    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).

    Morten

  2. Hi Morten,

    What problems are you experiencing? Do you use the following line:

    this.DisableEventFiring();

    to prevent the updatedEvent to be triggered when manipulating in the addedEvent?

Skip to main content