2009-02-27 15 views
9

Salut, j'ai le code suivant pour télécharger un fichier dans Sharepoint. Il utilise le protocole HTTP PUT:Téléchargement de fichiers vers la bibliothèque de documents Sharepoint (WSS 3.0) à l'aide de HTTP PUT

public static string UploadFile(string destUrl, string sourcePath) 
     { 
      try 
      { 
       Uri destUri = new Uri(destUrl); 
       FileStream inStream = File.OpenRead(sourcePath); 
       WebRequest req = WebRequest.Create(destUri); 
       req.Method = "PUT"; 
       req.Headers.Add("Overwrite", "F"); 
       req.Timeout = System.Threading.Timeout.Infinite; 
       req.Credentials = CredentialCache.DefaultCredentials; 
       Stream outStream = req.GetRequestStream(); 
       string status = CopyStream(inStream, outStream); 
       if (status == "success") 
       { 
        outStream.Close(); 
        WebResponse ores = req.GetResponse(); 
        return "success"; 
       } 
       else 
       { 
        return status; 
       } 
      } 
      catch (WebException we) 
      { 
      return we.Message; 
      } 
      catch (System.Exception ee) 
      { 
      return ee.Message; 
      } 
     } 

Quand je lance ce code, je reçois l'exception:

"The remote server returned an error: (409) Conflict."

Est-ce que quelqu'un a des idées que là où je me trompe?

Merci,

Alex

+0

Je viens de faire face au même problème - vérifiez que les URL sont valides! – Rashack

+0

C# noob demande: D'où vient CopyStream? –

+2

C'est une émanation du CopyRiver – Amicable

Répondre

8

J'ai rencontré ce problème lorsque je référence l'URL de la bibliothèque de documents et non le fichier de destination lui-même.

-à-dire essayer http://server nom/nom de la bibliothèque de documents/nouveau fichier name.doc

+0

J'ai eu le même problème, et votre solution fonctionne parfaitement. Simple et efficace. – Antoine

+0

Yup qui a fait l'affaire. À votre santé! – leeand00

0

Y at-il une raison paticular vous ne pouvez pas utiliser l'API Sharepoint (par exemple. SPFolder.Files.Add) pour télécharger le fichier? Comme suit:

http://msdn.microsoft.com/en-us/library/ms454491.aspx

public void UploadFile(string srcUrl, string destUrl) 
{ 
    if (! File.Exists(srcUrl)) 
    { 
     throw new ArgumentException(String.Format("{0} does not exist", 
      srcUrl), "srcUrl"); 
    } 

    SPWeb site = new SPSite(destUrl).OpenWeb(); 

    FileStream fStream = File.OpenRead(srcUrl); 
    byte[] contents = new byte[fStream.Length]; 
    fStream.Read(contents, 0, (int)fStream.Length); 
    fStream.Close(); 

    EnsureParentFolder(site, destUrl); 
    site.Files.Add(destUrl, contents); 
} 
+5

Cette approche ne nécessite-t-elle pas d'exécuter le code sur le serveur? Je pense que la question concerne la publication sur http. – msulis

0

Alex, Ce qui est arrivé à moi aussi. Vous devriez probablement créer une autre bibliothèque de documents ou éclairée et y télécharger des fichiers pour les tester.

Vous pouvez vérifier la variable "destUri" pour voir si elle pointe exactement vers la liste des points de partage attendus.

Ma situation est que j'ai d'abord créé une bibliothèque de documents "Requrements", il y a une faute de frappe, puis j'ai changé le titre pour "Requirements". Vous devriez noter que Sharepoint conserve toujours l'URL de cette liste sous la forme http://server:port/Requrements

Ceci est une exception. J'espère que ça aide.

1

Essayez:

void StorePlainFile(string target_url, string filename, byte[] file_bytes) 
{ 
     string url = target_url + "/" + filename; 
     System.Net.WebClient client = new System.Net.WebClient(); 
     client.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     client.Headers.Add("Overwrite", "F"); 
     byte[] response = client.UploadData(url, "PUT", file_bytes); 
} 
1

Je n'ai pas encore résolu mon problème, voilà pourquoi je suis ici, mais je sais pourquoi vous obtenez cette erreur.

L'erreur se produit car vous ne définissez pas de champ masqué mais obligatoire. Dans mon cas, je n'avais pas de colonnes, et certainement pas de colonnes requises. Cependant, il existe un champ de versionnement en conflit.

Mon intention est de 1) télécharger le document, et 2) définir les métadonnées du document. 1) et 2) se produisent sur des appels HTTP séparés. Idéalement, je veux le faire en un seul appel, mais je ne sais pas comment le faire.

Pour ce faire, 1) réussit, de sorte que le document apparaît dans la bibliothèque. Ensuite, quand j'essaie de mettre à jour les métadonnées, c'est quand j'obtiens l'erreur 409.Je suis assez sûr que j'ai d'abord besoin d'insérer une étape entre 1) et 2) qui télécharge d'abord la liste (ou manifeste) du document qui contiendrait en théorie les informations de versionnage nécessaires. Tout ce que je devrais faire est de définir les champs de métadonnées dont j'ai besoin, et renvoyer au serveur.

Non, nous ne souhaitons pas utiliser l'API Sharepoint car il n'y a pas de bibliothèque pour Java. ;-)

Questions connexes