2017-06-13 103 views
0

我试图将文件附加到我们的SharePoint站点上。C#SharePoint客户端列表附件

我可以通过编程方式创建列表项,但我无法附加附件。 要么它给了我一个401不允许的错误(这不能因为我有完全访问列表)或executeQuery永远挂起,直到超时。

这里是我当前的代码:(WPF应用程序)

 ClientContext clientContext = new ClientContext("http://<SITE-URL>/sites/Team-Place/<TeamPlace-ID>/"); 
     clientContext.RequestTimeout = int.MaxValue; 

     FileStream sr = new FileStream("Test.pdf", FileMode.Open); 
     byte[] contents = new byte[sr.Length]; 
     sr.Read(contents, 0, (int)sr.Length); 

     SP.List List = clientContext.Web.Lists.GetByTitle("<List Title>"); 

     if (List != null) 
     { 
      CamlQuery camlQuery = CamlQuery.CreateAllItemsQuery(); 
      SP.ListItemCollection Collection = List.GetItems(camlQuery); 
      clientContext.Load(List); 
      clientContext.Load(List.Fields); 
      clientContext.Load(Collection); 
      clientContext.ExecuteQuery(); 

      foreach (var x in List.Fields) 
       Debug.AppendText(x.InternalName + "\n"); 

      ListItemCreationInformation creationInfo = new ListItemCreationInformation(); 
      SP.ListItem Item = List.AddItem(creationInfo); 

      Item["Title"] = "Test"; 
      Item["Modell"] = "Test"; 
      Item["Seriennummer"] = "testserial"; 
      Item["Ger_x00e4_te_x002d_Typ"] = "Laptop"; 

      Item.Update(); 
      clientContext.ExecuteQuery(); 
      clientContext.Load(Item); 
      clientContext.ExecuteQuery(); 

      var attInfo = new AttachmentCreationInformation(); 
      attInfo.FileName = "Test.pdf"; 
      attInfo.ContentStream = sr; 
      var att = Item.AttachmentFiles.Add(attInfo); 

      Item.Update(); 

      clientContext.Load(att); 
      clientContext.Load(Item); 
      clientContext.ExecuteQuery(); 

      //System.Diagnostics.Debug.WriteLine(att.ServerRelativeUrl); 

      Item.Update(); 
      clientContext.ExecuteQuery(); 
      /* 
      * Not working pice of S#@* 
      string attachmentPath = string.Format("/Lists/Inventur_MOBI/Attachments/{0}/{1}", Item.Id, "Test.pdf"); 
      SP.File.SaveBinaryDirect(clientContext, attachmentPath, sr, false); 
      */ 
     } 
     else 
      Debug.AppendText("List not found"); 

我没有 “审查” 的一些东西出来。 SaveBinardDirect方法给了我一个不允许的401,并且附件给出一个超时。 我们有一个Sharepoint 2013.

有人有想法吗?

问候 BlueFire

回答

0

你的代码有两个问题。

首先,使用FileStream来读取文件,然后使用它与AttachmentCreationInformation对象。将其更改为:

byte[] contents = null; 
using (FileStream sr = new FileStream("Test.pdf", FileMode.Open)) 
{ 
    contents = new byte[sr.Length]; 
    sr.Read(contents, 0, (int)sr.Length); 
} 

//... 

using (MemoryStream ms = new MemoryStream(contents)) 
{ 
    var attInfo = new AttachmentCreationInformation(); 
    attInfo.FileName = "Test.pdf"; 
    attInfo.ContentStream = ms; 
    // ... 
} 

其次,创建了新的ListItem对象再次retreive它来保护你保存冲突之后。用途:

ListItem newItem = List.AddItem(creationInfo); 
newItem["Title"] = "Test"; 
// ... 

newItem.Update(); 
clientContext.Load(newItem, i => i.Id); 
clientContext.ExecuteQuery(); 

var item = List.GetItemById(newItem.Id); 

using (MemoryStream ms = new MemoryStream(contents)) 
{ 
    // ... 
    var att = item.AttachmentFiles.Add(attInfo); 
    item.Update(); 
    clientContext.ExecuteQuery(); 
} 

哦,对401 Unathorized需要凭据传递到ClientContext:

clientContext.Credentials = new NetworkCredential("user", "password", "domain"); 
+0

上传它作为一个内存流似乎已经完成了帽子戏法。 – BlueFire

相关问题