sharepointonlinecredentials query online getitems examples c# windows-8 sharepoint-2013 csom

c# - query - sharepoint online client components sdk



¿Cómo descargar/cargar archivos desde/a SharePoint 2013 usando CSOM? (6)

Estoy desarrollando una aplicación cliente Win8 (WinRT, C #, XAML) (CSOM) que necesita descargar / cargar archivos desde / a SharePoint 2013.

¿Cómo hago la descarga / carga?


Cargar un archivo

Cargue un archivo a un sitio de SharePoint (incluido SharePoint Online) usando el método File.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); } }

Descargar archivo

Descargue el archivo desde un sitio de SharePoint (incluido SharePoint Online) utilizando el método File.OpenBinaryDirect :

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


Este article describe varias opciones para acceder al contenido de SharePoint. Puede elegir entre REST y CSOM. Probaría CSOM si es posible. La carga / descarga de archivos se describe específicamente en this artículo.

Notas generales:

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

Evite trabajar con la transmisión directamente, léala primero en la memoria. Los flujos enlazados a la red no son necesariamente compatibles con las operaciones de flujo, por no mencionar el rendimiento. Por lo tanto, si está leyendo una imagen de esa secuencia o analizando un documento, puede terminar con algún comportamiento inesperado.

En una nota al margen, tengo una pregunta relacionada con respecto al rendimiento de este código anterior, ya que está penalizando con cada solicitud de archivo. Mira here . Y sí, necesitas 4.5 completo perfil .NET para esto.


File.OpenBinaryDirect puede causar una excepción cuando está utilizando Oauth accestoken Explicado en este artículo

El código debe escribirse a continuación para evitar excepciones.

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;


Le sugeriría leer algunos documentos de Microsoft sobre lo que puede hacer con CSOM. Este podría ser un ejemplo de lo que está buscando, pero hay una gran API documentada en 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


Solo una sugerencia de la codificación de archivos en línea y local de SharePoint 2013 es UTF-8 BOM. Asegúrese de que su archivo sea UTF-8 BOM; de lo contrario, es posible que su html y scripts cargados no se hayan procesado correctamente en el navegador.


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