Question

Quelle est la meilleure façon de télécharger un fichier dans une bibliothèque de documents sur un serveur SharePoint via les services Web intégrés exposés par la version WSS 3.0 ?

Suite aux deux premières réponses...

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

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

Il existe également 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 réussi avec ce service CopyIntoItems méthode.Serait-ce 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 publié notre code comme réponse suggérée.

Était-ce utile?

La solution

Exemple d'utilisation du service Web WSS "Copier" pour télécharger un document dans 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)
    {
        // ...
    }
}

Autres conseils

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...

Il y a quelques éléments à considérer :

  • Copier.CopyIntoItems a besoin que le document soit déjà présent sur un serveur.Le document est passé en paramètre de l'appel du webservice, ce qui limitera 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...) placera uniquement le document dans la bibliothèque, mais ne définira 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 souhaiterez peut-être archiver des 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 économiser des déplacements vers le serveur.
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 dissociation.

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

D'un collègue de travail :

Manière paresseuse :l'interface de votre système de fichiers Windows WebDAV.C'est une mauvaise solution programmatique car elle repose sur le service WindowsClient exécuté sur votre système d'exploitation et ne fonctionne également que sur les sites Web exécutés sur le port 80.Mappez un lecteur à la bibliothèque de documents et procédez à la copie du fichier.

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

Je pense que vous pouvez télécharger des fichiers via l'API FrontPage, mais je ne connais personne qui l'utilise réellement.

Je ne sais pas exactement quel service Web utiliser, mais si vous êtes dans une position où vous pouvez utiliser les DLL de l'API SharePoint .NET, alors utiliser SPList et SPLibrary.Items.Add est vraiment simple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top