Heute wurde mir in einer SharePoint Schulung eine Anforderung präsentiert: Beim Upload eines Bildes in eine Dokumentbibliothek soll automatisch ein Thumbnail generiert werden.
Ein einfacher Lösungsansatz ist es, einen EventReceiver zu erstellen. Dieser wird nach dem Hochladen einer Datei ausgelöst und konvertiert die hochgeladene Datei in ein kleineres Format.
SourceCode
1: public class PictureUploadEventReceiver : SPItemEventReceiver
2: {
3: /// <summary>
4: /// An item was added.
5: /// </summary>
6: public override void ItemAdded(SPItemEventProperties properties)
7: {
8: try
9: {
10: SPListItem item = properties.ListItem;
11: if (item.File.Name.ToLower().EndsWith("jpg") && !item.File.Name.ToLower().StartsWith("small_"))
12: {
13: Stream stream = properties.ListItem.File.OpenBinaryStream();
14: Image pic = Image.FromStream(stream);
15:
16: Image small = pic.GetThumbnailImage(100, 100, new Image.GetThumbnailImageAbort(CallBack), IntPtr.Zero);
17:
18: MemoryStream str = new MemoryStream();
19: small.Save(str, ImageFormat.Jpeg );
20:
21: Byte[] content = new Byte[str.Length];
22:
23: content = str.ToArray();
24:
25: SPList bibliothek = item.ParentList;
26: string newUrl = bibliothek.RootFolder.Url + "/small_" + item.File.Name;
27:
28: bibliothek.RootFolder.Files.Add(newUrl, content);
29: bibliothek.Update();
30: }
31: }
32: catch (Exception ex)
33: {
34:
35: }
36: base.ItemAdded(properties);
37: }
38:
39: public bool CallBack()
40: {
41: return true;
42: }
Zunächst wird in Zeile 11 der Dateiname der hochgeladenen Datei geprüft. Danach wird aus der Datei ein Image Objekt erstellt. Dieses bietet die Funktion GetThumbnailImage. Die Paramter der Funktion sind die neue Abmessung, sowie eine Callback-Funktion die laut MSDN Dokumentation nicht aufgerufen wird, aber anzugeben ist… Nun gut, ich nehme es mal zur Kenntnis und denke nicht weiter über den Grund nach
Dann wird der Bildinhalt als Byte-Array gespeichert. In Zeile 26 erstelle ich den neuen Dateiname erstellt. In diesem Beispiel wird dem neuen Dateinamen “small_” vorangestellt. Im Anschluss noch das Byte Array als neue Datei in die Dokumentbibliothek hochladen. und der SourceCode ist fertig.
Deployment
Um den EventReceiver in SharePoint zu installieren ist noch eine Elements_Datei notwendig. Zum Glück legt Visual Studio 2010 diese Datei automatisch an, sobald ein EventReceiver erstellt wird.
1: <?xml version="1.0" encoding="utf-8"?>
2: <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
3: <Receivers ListTemplateId="101">
4: <Receiver>
5: <Name>PictureUploadEventReceiverItemAdded</Name>
6: <Type>ItemAdded</Type>
7: <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
8: <Class>PictureConverter.PictureUploadEventReceiver.PictureUploadEventReceiver</Class>
9: <SequenceNumber>10000</SequenceNumber>
10: </Receiver>
11:
12: </Receivers>
13: </Elements>
In diesem Fall wird der EventReceiver an eine Liste vom Typ 101 (also Dokumentbibliothek) gebunden. Somit wird der EventReceiver nun bei allen Dokumentbibliotheken ausgelöst.
Ok, EventReceiver fertig und kann nun auch deployed werden.