Déployez vos documents sur OneDrive Entreprise par la programmation

Pour faire suite à mon précédent billet sur le téléchargement de fichiers depuis Google Drive, ce billet traitera de la mise à disposition de documents sur OneDrive Entreprise par le code.

A la fin de ce tutorial, vous serez à même de connecter votre application à votre environnement OneDrive Entreprise et d’y uploader vos fichiers et dossiers.

OneDrive Entreprise

Là où OneDrive est un service gratuit de stockage personnel avec un compte Microsoft, OneDrive Entreprise (ou OneDrive for Business en anglais) est une solution de stockage conçue pour les entreprises : Vous pouvez partager vos documents et collaborer avec vos collègues, à la SharePoint.

Un espace OneDrive Entreprise est géré par un administrateur de collection de site.

Il est ainsi possible en vous donnant les droits suffisants, d’accéder aux espaces de stockages de vos collaborateurs sous OneDrive Entreprise et ainsi, d’y déployer leurs documents.

Techniquement, OneDrive Entreprise est une bibliothèque de documents SharePoint, ainsi, pour accéder à celle-ci par la programmation, nous utiliserons une API SharePoint : CSOM.

SharePoint CSOM

SharePoint CSOM (Client-side Service Object Model) est une API .NET de SharePoint, qui vous permet d’interagir, entre autre, avec votre site personnel OneDrive Entreprise.

En l’occurrence ici, nous allons l’utiliser pour uploader une arborescence locale de documents sur une bibliothèque de documents OneDrive Entreprise d’un membre de notre organisation.

Se connecter à OneDrive Entreprise par la programmation

Afin de se connecter à votre site, vous aurez besoin au préalable de vous munir de :
  • L’URL du site OneDrive Entreprise
  • Le login et mot de passe d’un compte ayant des droits de connexion sur le site.
Il ne vous reste plus qu’à récupérer votre contexte en passant l’url de votre site :var context = new ClientContext(« https://cltservices-my.sharepoint.com/personal/emailbidon_com/Documents/Forms/All.aspx »);
 
Une fois celui-ci obtenu, il vous faudra vous identifier, puis vous aurez accès à votre site via la classe Webqui correspond au site SharePoint sur lequel vous venez de vous identifier.
 
using (var context = new ClientContext(ConfigurationManager.AppSettings["onedrive:urlSite"]))
{
    // Connexion au site OneDrive
    var passWord = new SecureString();
    foreach (var c in ConfigurationManager.AppSettings["onedrive:password"]) passWord.AppendChar(c);
    context.Credentials = new SharePointOnlineCredentials(ConfigurationManager.AppSettings["onedrive:login"], passWord);
    Web web = context.Web;
 
    // Récupération de la bibliothèque de documents et chargement des dossiers présents à la racine
    List docs = web.Lists.GetByTitle("Documents");
    context.Load(docs.RootFolder.Folders);
    context.ExecuteQuery();
 
    // On récupère dans une variable l'ensemble des dossiers
    List<Folder> foldersInLibrary = docs.RootFolder.Folders.ToList();
}
Celui-ci, a accès à toutes les informations de ce qui le compose. Ici, ce qui nous intéresse, c’est de nous connecter à la bibliothèque de documents.
 
La bibliothèque par défaut se nommant « Documents » nous pouvons la récupérer directement par son nom : List docs = web.Lists.GetByTitle(« Documents »);
 

Chargement et exécution

Le modèle client objet de SharePoint, que l’on passe par C# ou JavaScript requiert que l’on charge au préalable les ressources dont on aura besoin. Ainsi, si vous ne voulez pas vous retrouver avec une erreur de chargement « NotInitializedException », il vous faudra à chaque fois charger les ressources avant de les utiliser en appelant ExecuteQuery()

Ainsi, pour récupérer l’ensemble des dossiers à la racine, dans notre cas, il nous faudra faire

    context.Load(docs.RootFolder.Folders);
    context.ExecuteQuery();
 
Pour ensuite pouvoir les récupérer dans notre variable
 
    List<Folder> foldersInLibrary = docs.RootFolder.Folders.ToList();

Obtenir les droits d’administration des espaces de stockage de vos utilisateurs sous Office 365

Si vous voulez mettre à disposition les anciens documents de vos collaborateurs sur leurs propres espaces, vous aurez au préalable besoin d’avoir les droits sur leurs espaces de stockage.

Pour cela,

  1. Rendez-vous dans la partie d’administration de votre environnement Office 365 en cliquant sur le carré en haut à droite puis sur « Admin »
  2. Cliquez ensuite sur « SharePoint » dans le menu dépliant « Admin »
  3. L’interface centrale d’administration de SharePoint Online s’offre alors à vous. Cliquez sur « User Profiles » dans le menu de gauche pour accéder à la gestion de vos profils utilisateurs
  4. Vous pourrez ensuite rechercher votre utilisateur par son nom
  5. Une fois celui-ci obtenu, cliquez sur la flèche à droite de son nom de compte, puis sur « Manage site collection owners »
  6. Dans notre cas, nous sommes sur la collection de Pier-Lionel, ainsi vous retrouverez son nom dans les deux sections « Administrateur primaire de la collection de site » ainsi que dans la partie « Administrateurs de la collection de site », ajoutez vous dans cette seconde partie pour vous donner les droits sur cet environnement
Vous pourrez désormais accéder directement à sa bibliothèque de documents par votre navigateur ainsi que via votre application.

Créer un dossier sous une bibliothèque de document OneDrive Entreprise

Précédemment nous avons préchargé l’ensemble des dossiers à la racine de notre bibliothèque « Documents »
    context.Load(docs.RootFolder.Folders);
    context.ExecuteQuery();
List<Folder> foldersInLibrary = docs.RootFolder.Folders.ToList();

Désormais, ce qui nous intéresse est de pouvoir créer notre premier dossier afin d’y déployer les documents de notre utilisateur.

Afin de créer un dossier, rien de plus simple, il vous suffit de faire

if (foldersInLibrary.Count(s => s.Name == destFolder) == 0)
{
    docs.RootFolder.Folders.Add(destFolder);
    context.ExecuteQuery();
}
Ici, nous vérifions que notre dossier n’existe pas déjà avant de le créer, et le cas échéant, nous faisons appel à la méthode « Add » qui demande un nom de dossier comme argument.
Vous pourrez également remarquer la présence de context.ExecuteQuery(); en réalité, votre dossier ne sera créé qu’à partir de ce moment, executeQuery agit comme un « push » de vos actions vers votre site.

Ajouter des fichiers à l’intérieur d’un dossier

Notre dossier créé, nous allons maintenant ajouter des fichiers à l’intérieur.

Pour cela, vous aurez besoin de charger au préalable les fichiers de votre nouveau dossier, pour accéder à celui-ci, nous utiliserons la méthode « GetByUrl » de la classe FolderCollection

context.Load(docs.RootFolder.Folders.GetByUrl(destFolder).Files);
context.ExecuteQuery();
// Cette variable permet de définir le dossier de travail actuel et d'y ajouter des fichiers par la suite
folderToWork = docs.RootFolder.Folders.GetByUrl(destFolder);

 

Pour uploader votre fichier, l’API CSOM requiert de créer votre nouveau fichier via la classe FileCreationInformation

var newFile = new FileCreationInformation { ContentStream = stream, Url = Path.GetFileName(fileName) };

Comme vous pouvez le voir, celui-ci attend un Stream ainsi qu’un nom de fichier, récupérez donc le flux du fichier que vous souhaitez uploader et passez le à l’instanciation de votre nouveau fichier

byte[] fileData = System.IO.File.ReadAllBytes(fileName);
using (Stream stream = new MemoryStream(fileData))
{
    var newFile = new FileCreationInformation { ContentStream = stream, Url = Path.GetFileName(fileName) };

Votre dossier initialisé et votre nouveau fichier prêt à l’ajout, il ne vous reste plus qu’à ajouter ce dernier à votre bibliothèque de documents via la méthode Add de la classe FileCollection

if (folderToWork != null)
{
    List<File> filesInLibrary = folderToWork.Files.ToList();
    string newfileName = Path.GetFileName(fileName);
 
    if (filesInLibrary.Any(s => s.Name == newfileName))
    {
        return;
    }
    folderToWork.Files.Add(newFile);
    context.ExecuteQuery();
}

Aller plus loin

Pour les curieux, une solution est mise à disposition sur GitHub permettant de télécharger une arborescence Google Drive à partir d’un id de dossier parent pour la retranscrire sous OneDrive Entreprise :
Pour plus de détails sur ce que l’API CSOM de SharePoint est capable de vous offrir, je vous invite à visiter la documentation officielle de Microsoft, accessible via le lien ci-dessous :

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s