在SharePoint的列表中,每个列表条目可以拥有0到多个附件文件(附件功能可以在列表常规设置中开启或关闭),在对象模型中,访问这些附件,则可以使用对象模型中的SPAttachmentCollection类来完成。
使用SPAttachmentCollection.Count属性可以得到该列表条目中附件的个数,使用以下方法,则可以获得每一个附件所在的地址。
· attachments[int index]:通过下标得到附件的文件名,这些附件实际上也是保存在SharePoint的文件系统中的,它们的url为:“List/Attachments/ItemID/FileName”,自然地,SPAttachmentCollection的对象模型中也提供了这样一个属性来访问这一串地址:
· UrlPrefix:附件文件的前缀url地址(绝对url)。
附件的添加和删除,和添加、删除文件的方法是一样的。
· Add(string filename, byte[] data):第一个参数指定文件名,第二个参数指定附件内容的字节流。该文件已经存在的时候,也会返回一个异常。
· Delete(string filename):根据文件名删除该附件。
与添加、删除文件不同的是,因为附件操作是包含在列表条目的修改之中,所以使用Add方法和Delete方法必须调用SPListItem.Update方法才能使修改生效。为了更直接的对附件进行操作,免除Update这一麻烦,SPAttachmentCollection类中提供了AddNow和DeleteNow两个方法,它们的参数和使用与Add和Delete方法一致,只是调用完之后立刻生效,而不再需要进行Update。
在一个列表条目生成之前,SPListItem中的一切属性都是不可用的,所以在对附件进行操作的时候尤其要进行注意,只能对已有的列表条目进行附件的操作。在添加一个新的列表条目的时候,也必须先执行SPListItem.Update,使之成为已有的列表条目,然后才能进行附件操作。
【示例9-9】 该示例读取DemoList列表第一个列表条目的附件,并将它们保存到本地:
// 首先获取到SPWeb对象web
SPList list = web.Lists["DemoList"];
SPListItem item = list.Items[0];
SPAttachmentCollection attach = item.Attachments;
for(int i=0; i<attach.Count; i++)
{
String url = attach.UrlPrefix + attach[i];
Console.WriteLine("正在下载{0}...", url);
SPFile file = web.GetFile(url);
FileStream fs = new FileStream(file.Name, FileMode.Create);
byte[] content = file.OpenBinary();
fs.Write(content, 0, content.Length);
fs.Close();
}