2009-02-27 10 views
9

Hallo Ich habe den folgenden Code zum Hochladen einer Datei nach Sharepoint. Es verwendet HTTP PUT:Hochladen von Dateien in Sharepoint (WSS 3.0) Dokumentbibliothek mit 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; 
      } 
     } 

Wenn ich diesen Code ausführen bekomme ich die Ausnahme:

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

Hat jemand irgendwelche Ideen, wo ich falsch gehe?

Danke,

Alex

+0

Ich habe gerade das gleiche Problem konfrontiert - überprüfen Sie, dass die URLs gültig sind! – Rashack

+0

C# noob fragt: Woher kommt CopyStream? –

+2

Es ist ein Ableger des CopyRiver – Amicable

Antwort

8

Ich hatte dieses Problem, wenn ich die URL der Dokumentbibliothek referenzierte und nicht die Zieldatei selbst.

also versuchen http://server Name/Dokumentbibliothek Name/neue Datei name.doc

+0

Ich hatte das gleiche Problem, und Ihre Lösung funktioniert perfekt. Einfach und effizient. – Antoine

+0

Ja, das hat den Trick gemacht. Prost! – leeand00

0

Gibt es einen Grund paticular Sie können nicht nur die Verwendung von Sharepoint-API (z. B. SPFolder.Files.Add) beginnen die Datei hochladen? Wie folgt:

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

Ist für diesen Ansatz kein Code auf dem Server erforderlich? Ich denke, die Frage ist über das Posting über http. – msulis

0

Alex, Auch das mir passiert ist. Sie sollten wahrscheinlich eine andere beleuchtete oder Dokumentbibliothek erstellen und Dateien zum Testen hochladen.

Sie können die Variable "destUri" überprüfen, um festzustellen, ob sie genau auf die erwartete Sharepoint-Liste zeigt.

Meine Situation ist, dass ich zuerst eine Dokumentbibliothek "Requurements" erstellt habe, gibt es einen Tippfehler, dann änderte ich den Titel zu "Anforderungen". Sie sollten beachten, dass Sharepoint die URL zu dieser Liste weiterhin als http://server:port/Requrements

behält. Dies ist eine Ausnahme. Hoffentlich hilft es.

1

Versuchen:

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

Ich habe mein Problem noch nicht gelöst, das ist, warum ich hier bin, aber ich weiß, Warum bekommst du diesen Fehler?

Der Fehler tritt auf, weil Sie kein verstecktes, aber erforderliches Feld festlegen. In meinem Fall hatte ich keine Spalten und sicherlich keine, die benötigt wurden. Es gibt jedoch ein Versionsfeld, das in Konflikt steht.

Meine Absicht ist 1) das Dokument hochzuladen und 2) die Metadaten des Dokuments einzustellen. 1) und 2) treten über separate HTTP-Aufrufe auf. Im Idealfall möchte ich dies in einem einzigen Anruf tun, aber ich weiß nicht, wie das geht.

Um dies zu erreichen, 1) ist erfolgreich, so dass das Dokument in der Bibliothek angezeigt wird. Wenn ich dann versuche, die Metadaten zu aktualisieren, bekomme ich den Fehler 409.

Ich bin ziemlich sicher, dass ich zuerst einen Schritt zwischen 1) und 2) einfügen muss, der zuerst die Liste des Dokuments (oder Manifests) herunterlädt, die theoretisch die benötigten Versionsinformationen enthalten würde. Alles, was ich tun müsste, ist die Metadaten Felder, die ich brauche, und senden Sie sie zurück an den Server.

Nein, wir möchten die Sharepoint-API nicht verwenden, da es in Java keine Bibliotheken dafür gibt. ;-)

Verwandte Themen