Comment télécharger/télécharger des fichiers à partir de / vers SharePoint 2013 en utilisant CSOM?

je développe une application client (CSOM) Win8 (WinRT, C#, XAML) qui a besoin de télécharger/télécharger des fichiers à partir de/vers SharePoint 2013.

Comment Télécharger / Télécharger?

29
demandé sur johnnyRose 2013-06-12 07:07:39

6 réponses

Télécharger un fichier

télécharger un fichier sur un site SharePoint (y compris SharePoint Online) en utilisant le fichier .Méthode SaveBinaryDirect :

using (var clientContext = new ClientContext(url))
{
     using (var fs = new FileStream(fileName, FileMode.Open))
     {
         var fi = new FileInfo(fileName);
         var list = clientContext.Web.Lists.GetByTitle(listTitle);
         clientContext.Load(list.RootFolder);
         clientContext.ExecuteQuery();
         var fileUrl = String.Format("{0}/{1}", list.RootFolder.ServerRelativeUrl, fi.Name);

         Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, fileUrl, fs, true);
     }
}

télécharger le fichier

télécharger un fichier à partir d'un site SharePoint (y compris SharePoint Online) en utilisant le fichier .Méthode :

using (var clientContext = new ClientContext(url))
{

     var list = clientContext.Web.Lists.GetByTitle(listTitle);
     var listItem = list.GetItemById(listItemId);
     clientContext.Load(list);
     clientContext.Load(listItem, i => i.File);
     clientContext.ExecuteQuery();

     var fileRef = listItem.File.ServerRelativeUrl;
     var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, fileRef);
     var fileName = Path.Combine(filePath,(string)listItem.File.Name);
     using (var fileStream = System.IO.File.Create(fileName))
     {                  
          fileInfo.Stream.CopyTo(fileStream);
     }
}
48
répondu Vadim Gremyachev 2015-04-07 07:07:47

Ce article décrit les diverses options pour accéder au contenu SharePoint. Vous avez le choix entre le repos et CSOM. J'essaierais CSOM si possible. Le téléchargement de fichier spécifiquement est bien décrit dans cet" article 151930920".

dans l'Ensemble, notes:

    //First construct client context, the object which will be responsible for
    //communication with SharePoint:
    var context = new ClientContext(@"http://site.absolute.url")

    //then get a hold of the list item you want to download, for example
    var list = context.Web.Lists.GetByTitle("Pipeline");
    var query = CamlQuery.CreateAllItemsQuery(10000);
    var result = list.GetItems(query);

    //note that data has not been loaded yet. In order to load the data
    //you need to tell SharePoint client what you want to download:

    context.Load(result, items=>items.Include(
        item => item["Title"],
        item => item["FileRef"]
    ));

    //now you get the data
    context.ExecuteQuery();

    //here you have list items, but not their content (files). To download file
    //you'll have to do something like this:

    var item = items.First();

    //get the URL of the file you want:
    var fileRef = item["FileRef"];

    //get the file contents:
    FileInformation fileInfo = File.OpenBinaryDirect(context, fileRef.ToString());

    using (var memory = new MemoryStream())
    {
          byte[] buffer = new byte[1024 * 64];
          int nread = 0;
          while ((nread = fileInfo.Stream.Read(buffer, 0, buffer.Length)) > 0)
          {
              memory.Write(buffer, 0, nread);
          }
          memory.Seek(0, SeekOrigin.Begin);
          // ... here you have the contents of your file in memory, 
          // do whatever you want
    }

évitez de travailler directement avec le flux, lisez-le d'abord dans la mémoire. Réseau lié aux flux ne sont pas nécessairement soutenir les flux de opérations, sans parler de la performance. Donc, si vous lisez une image de ce flux ou analysez un document, vous pourriez vous retrouver avec un comportement inattendu.

sur une note de côté, j'ai une question connexe re: performance de ce code ci-dessus, comme vous prenez une certaine pénalité avec chaque demande de dossier. Voir ici . Et oui, vous avez besoin de 4.5 profil.net complet pour cela.

26
répondu Borv 2017-05-23 10:31:12

fichier.OpenBinaryDirect peut causer des exceptions lorsque vous utilisez Oauth accestoken Expliqué dans cet Article

Le Code

doit être écrit comme ci-dessous pour éviter les exceptions

 Uri filename = new Uri(filepath);
        string server = filename.AbsoluteUri.Replace(filename.AbsolutePath, 
         "");
        string serverrelative = filename.AbsolutePath;

        Microsoft.SharePoint.Client.File file = 
        this.ClientContext.Web.GetFileByServerRelativeUrl(serverrelative);
        this.ClientContext.Load(file);
        ClientResult<Stream> streamResult = file.OpenBinaryStream();
        this.ClientContext.ExecuteQuery();
        return streamResult.Value;
5
répondu Ram chittala 2017-05-09 16:53:31
Private Sub DownloadFile(relativeUrl As String, destinationPath As String, name As String)
    Try
        destinationPath = Replace(destinationPath + "\" + name, "\", "\")
        Dim fi As FileInformation = Microsoft.SharePoint.Client.File.OpenBinaryDirect(Me.context, relativeUrl)
        Dim down As Stream = System.IO.File.Create(destinationPath)
        Dim a As Integer = fi.Stream.ReadByte()
        While a <> -1
            down.WriteByte(CType(a, Byte))
            a = fi.Stream.ReadByte()
        End While
    Catch ex As Exception
        ToLog(Type.ERROR, ex.Message)
    End Try
End Sub
1
répondu Angel 2016-04-15 12:06:24

je suggère de lire de la documentation de Microsoft sur ce que vous pouvez faire avec CSOM. Ceci pourrait être un exemple de ce que vous recherchez, mais il y a une énorme API documentée dans msdn.

// Starting with ClientContext, the constructor requires a URL to the 
// server running SharePoint. 
ClientContext context = new ClientContext("http://SiteUrl"); 

// Assume that the web has a list named "Announcements". 
List announcementsList = context.Web.Lists.GetByTitle("Announcements"); 

// Assume there is a list item with ID=1. 
ListItem listItem = announcementsList.Items.GetById(1); 

// Write a new value to the Body field of the Announcement item.
listItem["Body"] = "This is my new value!!"; 
listItem.Update(); 

context.ExecuteQuery(); 

de: http://msdn.microsoft.com/en-us/library/fp179912.aspx

0
répondu Dan Teesdale 2013-06-12 03:45:52

Juste une suggestion SharePoint 2013 en ligne et sur prem fichier est encodé en UTF-8 BOM. Assurez-vous que votre fichier est UTF-8 BOM, sinon votre html téléchargé et les scripts peuvent ne pas être rendus correctement dans le navigateur.

0
répondu karayakar 2017-03-01 17:38:37