[C#.NET][Sharepoint 2013] Use CSOM upload attachments in List
續上篇:http://www.dotblogs.com.tw/yc421206/archive/2014/06/05/145383.aspx
文件庫可以上傳檔案,清單也可以,我新增了一個 Custom List 的 App,命名為 myList,如下圖所示:
開始寫 Code 之前,要先瞭解一下以下幾點
- 一筆項目可以擁有多個附件
- 每一個附件有自己的 Url
- 項目有版控,附件沒有,所以同一筆項目的附件,檔名不能重複
範例位置:
項目裡的欄位用 CamlQuery.CreateAllItemsQuery() 全部撈出來,並根據 Title 取得特定項目,拋棄舊有的 CAMLQuery,擁抱 LINQ
ListItemCreationInformation 用來新增一筆項目
{
using (ClientContext client = new ClientContext("http://sps2013"))
{
client.Credentials = new NetworkCredential(YourId, YourPassword, YourDomai
var list = client.Web.Lists.GetByTitle("myList");
ListItemCollection items = list.GetItems(CamlQuery.CreateAllItemsQuery());
client.Load(list);
client.Load(items);
client.ExecuteQuery();
var findItem = items.FirstOrDefault(o => o["Title"] == YourItemTitle);
if (findItem != null)
{
Console.WriteLine("Item Exist");
Console.ReadKey();
return;
}
ListItem newItem = list.AddItem(new ListItemCreationInformation());
newItem["Title"] = YourItemTitle;
newItem.Update();
client.Load(newItem);
client.ExecuteQuery();
Console.WriteLine("Item already Created!! GUID is {0}", newItem["GUID"]);
Console.ReadKey();
}
}
程式碼沒有太大的困難,很明顯的 AttachmentCreationInformation 用來新增附件;記得,項目內的附件不能重覆
{
using (ClientContext client = new ClientContext("http://sps2013"))
{
client.Credentials = new NetworkCredential(YourId, YourPassword, YourDomain);
var list = client.Web.Lists.GetByTitle("myList");
CamlQuery query = CamlQuery.CreateAllItemsQuery();
var items = list.GetItems(query);
client.Load(items);
client.ExecuteQuery();
var findItem = items.FirstOrDefault(o => o["Title"].ToString() == YourItemTitle);
if (findItem == null)
{
Console.WriteLine("Not Found");
Console.ReadKey();
return;
}
findItem.AttachmentFiles.Add(
new AttachmentCreationInformation()
{
ContentStream = System.IO.File.Open("myDoc.docx", FileMode.Open),
FileName = "myDoc.docx",
});
findItem.AttachmentFiles.Add(
new AttachmentCreationInformation()
{
ContentStream = System.IO.File.Open("簡歷.docx", FileMode.Open),
FileName = "簡歷.docx",
});
client.Load(findItem);
client.ExecuteQuery();
Console.WriteLine("Attachment already Upload!! GUID is {0}", findItem["GUID"]);
Console.ReadKey();
}
}
執行結果如下圖:
ListItem.ServerRelativeUrl 可被 OpenBinaryDirect 方法解析正確的路徑,並下載
{
using (ClientContext client = new ClientContext("http://sps2013"))
{
client.Credentials = new NetworkCredential(YourId, YourPassword, YourDomain);
var list = client.Web.Lists.GetByTitle("myList");
var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
client.Load(items);
client.ExecuteQuery();
var findItem = items.FirstOrDefault(o => o["Title"].ToString() == YourItemTitle);
if (findItem == null)
{
Console.WriteLine("Not Found");
Console.ReadKey();
return;
}
client.Load(findItem.AttachmentFiles);
client.ExecuteQuery();
var findAttachment = findItem.AttachmentFiles.FirstOrDefault(o => o.FileName == "myDoc.docx");
if (findAttachment == null)
{
Console.WriteLine("Not Found Attachment");
Console.ReadKey();
return;
}
var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(client, findAttachment.ServerRelativeUrl);
byte[] readbuffer = null;
using (var memory = new MemoryStream())
{
while (true)
{
byte[] buffer = new byte[1024];
var length = fileInfo.Stream.Read(buffer, 0, buffer.Length);
if (length <= 0)
{
break;
}
memory.Write(buffer, 0, length);
}
memory.Seek(0, SeekOrigin.Begin);
readbuffer = memory.ToArray();
}
var targetStream = new FileStream("download.docx", FileMode.Create, FileAccess.Write);
targetStream.Write(readbuffer, 0, readbuffer.Length);
targetStream.Dispose();
fileInfo.Dispose();
Console.WriteLine("Attachment already Upload!! File Name is {0}", findAttachment.FileName);
Console.ReadKey();
}
}
Delete Attachment
找出特定 Attachment,調用 DeleteObject 方法,砍掉它
{
using (ClientContext client = new ClientContext("http://sps2013"))
{
client.Credentials = new NetworkCredential(YourId, YourPassword, YourDomain);
var list = client.Web.Lists.GetByTitle("myList");
var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
client.Load(items);
client.ExecuteQuery();
var findItem = items.FirstOrDefault(o => o["Title"].ToString() == YourItemTitle);
if (findItem == null)
{
Console.WriteLine("Not Found");
Console.ReadKey();
return;
}
client.Load(findItem.AttachmentFiles);
client.ExecuteQuery();
var findAttachment = findItem.AttachmentFiles.FirstOrDefault(o => o.FileName == "myDoc.docx");
if (findAttachment != null)
findAttachment.DeleteObject();
client.Load(findItem);
client.ExecuteQuery();
Console.WriteLine("Attachment already Delete!! File Name is {0}", findAttachment.FileName);
Console.ReadKey();
}
}
本文出自:http://www.dotblogs.com.tw/yc421206/archive/2014/06/21/145658.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET