29 votes

Télécharger un fichier vers SharePoint via les services web intégrés

Quelle est la meilleure façon de télécharger un fichier vers une bibliothèque de documents sur un serveur SharePoint par le biais des services Web intégrés que la version WSS 3.0 expose ?

Après les deux premières réponses...

  • Nous devons absolument utiliser la couche Service Web, car nous allons effectuer ces appels à partir d'applications clientes distantes.

  • La méthode WebDAV nous conviendrait, mais nous préférerions être cohérents avec la méthode d'intégration des services Web.

Il existe en outre un service web pour télécharger des fichiers, pénible mais qui fonctionne tout le temps.

Faites-vous référence au service "Copie" ? Nous avons eu du succès avec ce service CopyIntoItems méthode. S'agit-il de la méthode recommandée pour télécharger un fichier dans les bibliothèques de documents en utilisant uniquement l'API du service Web WSS ?

J'ai posté notre code comme réponse suggérée.

15voto

Andy McCluggage Points 8583

Exemple d'utilisation du service Web WSS "Copy" pour télécharger un document vers une bibliothèque...

public static void UploadFile2007(string destinationUrl, byte[] fileData)
{
    // List of desination Urls, Just one in this example.
    string[] destinationUrls = { Uri.EscapeUriString(destinationUrl) };

    // Empty Field Information. This can be populated but not for this example.
    SharePoint2007CopyService.FieldInformation information = new 
        SharePoint2007CopyService.FieldInformation();
    SharePoint2007CopyService.FieldInformation[] info = { information };

    // To receive the result Xml.
    SharePoint2007CopyService.CopyResult[] result;

    // Create the Copy web service instance configured from the web.config file.
    SharePoint2007CopyService.CopySoapClient
    CopyService2007 = new CopySoapClient("CopySoap");
    CopyService2007.ClientCredentials.Windows.ClientCredential = 
        CredentialCache.DefaultNetworkCredentials;
    CopyService2007.ClientCredentials.Windows.AllowedImpersonationLevel = 
        System.Security.Principal.TokenImpersonationLevel.Delegation;

    CopyService2007.CopyIntoItems(destinationUrl, destinationUrls, info, fileData, out result);

    if (result[0].ErrorCode != SharePoint2007CopyService.CopyErrorCode.Success)
    {
        // ...
    }
}

9voto

Jim Harte Points 1338

Une autre option consiste à utiliser le bon vieux HTTP PUT :

WebClient webclient = new WebClient();
webclient.Credentials = new NetworkCredential(_userName, _password, _domain);
webclient.UploadFile(remoteFileURL, "PUT", FilePath);
webclient.Dispose();

Où remoteFileURL pointe vers votre bibliothèque de documents SharePoint...

8voto

Erik Erkelens Points 700

Il y a plusieurs choses à prendre en compte :

  • Copy.CopyIntoItems nécessite que le document soit déjà présent sur un certain serveur . Le document est transmis en tant que paramètre de l'appel au webservice, ce qui limite la taille du document. (Voir http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c )
  • la méthode "http put" (c'est-à-dire webdav...) ne fait que placer le document dans la bibliothèque, mais ne définit pas les valeurs des champs.
  • pour mettre à jour les valeurs des champs, vous pouvez appeler Lists.UpdateListItem après le "http put".
  • les bibliothèques de documents peuvent avoir des répertoires, vous pouvez les créer avec 'http mkcol'.
  • vous voudrez peut-être vérifier les fichiers avec Lists.CheckInFile
  • vous pouvez également créer un service Web personnalisé qui utilise l'API SPxxx .Net, mais ce nouveau service Web devra être installé sur le serveur. Cela pourrait vous éviter des déplacements sur le serveur.

6voto

Luke Hutton Points 2430
public static void UploadFile(byte[] fileData) {
  var copy = new Copy {
    Url = "http://servername/sitename/_vti_bin/copy.asmx", 
    UseDefaultCredentials = true
  };

  string destinationUrl = "http://servername/sitename/doclibrary/filename";
  string[] destinationUrls = {destinationUrl};

  var info1 = new FieldInformation
                {
                  DisplayName = "Title", 
                  InternalName = "Title", 
                  Type = FieldType.Text, 
                  Value = "New Title"
                };

  FieldInformation[] info = {info1};
  var copyResult = new CopyResult();
  CopyResult[] copyResults = {copyResult};

  copy.CopyIntoItems(
    destinationUrl, destinationUrls, info, fileData, out copyResults);
}

NOTE : Modification du 1er paramètre de CopyIntoItems au nom du fichier, Path.GetFileName(destinationUrl) fait disparaître le message de déliaison.

4voto

Eugene Katz Points 2784

J'ai eu de la chance en utilisant la classe wrapper DocLibHelper décrite ici : http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X