2017-06-13 1 views
0

J'essaye de joindre un fichier à une liste sur notre point de partage.C# SharePoint Client List Attachment

Je peux créer l'élément de liste par programmation, mais je ne peux pas joindre la pièce jointe. Soit il me donne une erreur 401 non autorisée (qui ne peut pas être parce que j'ai un accès complet à la liste) ou le executeQuery bloque pour toujours jusqu'à l'expiration.

Voici mon code actuel: (application 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"); 

Je ne "censurer" quelque chose dehors. La méthode SaveBinardDirect me donne un 401 non autorisé et l'attachement donne un timeout. Nous avons un Sharepoint 2013.

Quelqu'un a-t-il une idée?

Cordialement BlueFire

Répondre

0

Votre code ont deux problèmes.

D'abord, en utilisant FileStream pour lire le fichier, puis en l'utilisant avec l'objet AttachmentCreationInformation. Changer à:

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; 
    // ... 
} 

En second lieu, après avoir créé votre nouveau ListItem objet retreive une fois de plus pour vous protéger contre des conflits d'enregistrement. Utilisation:

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(); 
} 

Oh, et pour 401 Unathorized vous devez passer à des informations d'identification ClientContext:

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

les important au flux mémoire semble avoir fait le tour. – BlueFire