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?
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);
}
}
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.
fichier.OpenBinaryDirect peut causer des exceptions lorsque vous utilisez Oauth accestoken Expliqué dans cet Article
Le Codedoit ê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;
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
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();
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.