2015-12-06 1 views
-1

J'essaye de télécharger des fichiers dans un dossier en utilisant SharePoint et C#.Télécharger des fichiers pour partager un point en utilisant C#

J'ai réussi à créer des dossiers avec mon code et cela fonctionne très bien.

C'est ma classe de document:

[DataContractAttribute] 
public class Document 
{ 
    [DataMemberAttribute] 
    public string Name { get; set; } 

    [DataMemberAttribute] 
    public byte[] Content { get; set; } 

    [DataMemberAttribute] 
    public bool ReplaceExisting { get; set; } 

    [DataMemberAttribute] 
    public string Folder { get; set; } 

    [DataMemberAttribute] 
    public Dictionary<string, object> Properties { get; set; } 

    public Document() 
    { 
     Properties = new Dictionary<string, object>(); 
    } 

    public Document(string name, byte[] content) 
    { 
     Name = name; 
     ReplaceExisting = false; 
     Content = content; 
     Properties = new Dictionary<string, object>(); 
    } 

    public Document(string name, byte[] content, bool replace) 
    { 
     Name = name; 
     Content = content; 
     ReplaceExisting = replace; 
     Properties = new Dictionary<string, object>(); 
    } 
} 

Et c'est la classe où je l'utilise pour télécharger des fichiers (documents) dans un dossier de point de partage existant:

public class SharePointHandler : IDisposable 
{ 
    private static string sharePointSite = "My Site"; 
    private static string documentLibraryName = "Root folder"; 

    public SharePointHandler() { } 

    public void Upload(List<Document> documents, string company, int year, string quarter) 
    { 
     string Year = year.ToString(); 

     try 
     { 
      using (ClientContext context = new ClientContext(sharePointSite)) 
      { 
       var list = context.Web.Lists.GetByTitle(documentLibraryName); 
       context.Load(list); 

       var root = list.RootFolder; 
       context.Load(root); 
       context.ExecuteQuery(); 
       . 
       . 
       . 

       foreach (var document in documents) 
       { 
        var fileCreationInformation = new FileCreationInformation(); 
        fileCreationInformation.Content = document.Content; 

        fileCreationInformation.Overwrite = true; 

        fileCreationInformation.Url = list.RootFolder.ServerRelativeUrl + "/" + company + "/" + Year + "/" + quarter + "/" + document.Name; 
        Microsoft.SharePoint.Client.File uploadFile = quarterFolder.Files.Add(fileCreationInformation); 


        foreach (KeyValuePair<string, object> property in document.Properties) 
         uploadFile.ListItemAllFields[property.Key] = property.Value; 


        try 
        { 
         uploadFile.CheckOut(); 
         context.ExecuteQuery(); 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(ex.Message); 
        } 
        uploadFile.ListItemAllFields.Update(); 
        context.ExecuteQuery(); 

        uploadFile.CheckIn("", CheckinType.MajorCheckIn); 
        context.ExecuteQuery(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      EventLog.WriteEntry(ex.Message, EventLogEntryType.Error); 
      return; 
     } 
    } 

    public void Dispose() { } 
} 

Quand je lance le code que j'ai un document avec:

contenu: {octet [11430]}

dossier: NUL l

Nom: Testing.docx

Propriétés: Count = 0

ReplaceExisting: false

Tout fonctionne bien et je reçois l'URL nécessaire. Mais quand j'arrive à ces commandes:

try 
{ 
    uploadFile.CheckOut(); 
    context.ExecuteQuery(); 
} 

Le programme tombe et j'obtiens l'erreur qui dit: Fichier non trouvé.

Qu'est-ce que je fais mal?

Nous vous remercions de votre aide!

+0

Avez-vous essayé de créer un [MCVE] (http://stackoverflow.com/help/mcve)? –

+0

Je ne peux pas le faire en MVC, c'est dans mon lieu de travail. –

+0

Vous obtenez une erreur, car vous essayez de récupérer le fichier avant de le télécharger. Comme il n'existe pas encore, il échoue. Il suffit de supprimer uploadFile.CheckOut(); et ça marchera bien. Si vous souhaitez remplacer un document existant, vous devez trouver ce fichier via une requête, puis remplacer son contenu byte [] si vous souhaitez utiliser CheckOut. –

Répondre

1

Voici un exemple de travail d'un téléchargement vers SharePoint via CSOM:

using (ClientContext conext = new ClientContext(site.url)) 
{ 
    List projectFiles = projects.Web.Lists.GetByTitle("Project Files"); 
    context.Load(projectFiles.RootFolder, w => w.ServerRelativeUrl);      
    context.ExecuteQuery(); 

    FileStream documentStream = System.IO.File.OpenRead(filePath); 
    byte[] info = new byte[documentStream.Length]; 
    documentStream.Read(info, 0, (int)documentStream.Length); 

    string fileURL = projectFiles.RootFolder.ServerRelativeUrl + "/Folder/FileName.ext"; 

    FileCreationInformation fileCreationInformation = new FileCreationInformation(); 
    fileCreationInformation.Overwrite = true; 
    fileCreationInformation.Content = info; 
    fileCreationInformation.Url = fileURL; 
    Microsoft.SharePoint.Client.File uploadFile = projectFiles.RootFolder.Files.Add(fileCreationInformation); 
    context.Load(uploadFile, w => w.MajorVersion, w => w.MinorVersion); 
    context.ExecuteQuery(); 
} 

Dans votre cas, je télécharger le fichier et ExecuteQuery(), puis ajoutez vos métadonnées et exécuter une deuxième requête, assurez-vous vous ajoutez un context.Load après vos fichiers.Add(). Vous essayez de faire trop de choses à la fois, alors utilisez simplement ce code pour obtenir le fichier téléchargé et travailler votre chemin à travers vos autres besoins après. De plus, l'ajout de fichier ne créera pas de dossiers pour vous, alors assurez-vous de spécifier un chemin valide.