2009-02-27 10 views
9

Witam Mam następujący fragment kodu, aby przesłać plik do Sharepoint. Wykorzystuje PUT http:Przesyłanie plików do biblioteki dokumentów SharePoint (WSS 3.0) za pomocą protokołu 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; 
      } 
     } 

Gdy ten kod pojawia się wyjątek:

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

Czy ktoś ma jakieś pomysły na to, gdzie wezwę niewłaściwy?

Dzięki,

Alex

+0

Właśnie spotkałem się z tym samym problemem - sprawdź, czy adresy URL są prawidłowe! – Rashack

+0

C# noob pyta: Skąd pochodzi CopyStream? –

+2

To pochodna CopyRiver – Amicable

Odpowiedz

8

Miałem ten problem, gdy odwoływał się do adresu URL biblioteki dokumentów, a nie do pliku docelowego.

tj spróbować http://server nazwisko/nazwa pliku biblioteki dokumentów/nowy nazwa_pliku.doc

+0

Miałem ten sam problem, a twoje rozwiązanie działa idealnie. Prosty i wydajny. – Antoine

+0

Yup, który załatwił sprawę. Twoje zdrowie! – leeand00

0

istnieje paticular powodu nie można po prostu użyć API Sharepoint (np. SPFolder.Files.Add), aby przesłać plik? W następujący sposób:

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

Czy to podejście nie wymaga uruchomienia kodu na serwerze? Myślę, że pytanie dotyczy wysyłania wiadomości przez http. – msulis

0

Alex, Stało się to dla mnie też. Prawdopodobnie powinieneś stworzyć kolejną bibliotekę lub bibliotekę dokumentów i załadować do niej pliki do przetestowania.

Możesz chcieć sprawdzić zmienną "destUri", aby zobaczyć, czy wskazuje ona dokładnie oczekiwaną listę akcji.

Moja sytuacja polega na tym, że najpierw utworzyłem bibliotekę dokumentów "Wymagania", wystąpił błąd literowy, a następnie zmieniłem tytuł na "Wymagania". Należy zauważyć, że punkt podrzędny nadal zachowuje adres URL do tej listy jako URL-e. Jest to wyjątek. Mam nadzieję, że to pomaga.

1

Spróbuj:

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

nie rozwiązali jeszcze mój problem, dlatego jestem tutaj, ale wiem, dlaczego otrzymujesz ten błąd.

Błąd wynika z faktu, że nie ustawiono ukrytego, ale wymaganego pola. W moim przypadku nie miałem kolumn, a na pewno nie było to wymagane. Istnieje jednak pole wersji, w którym występuje konflikt.

Moim zamiarem jest 1) przesłanie dokumentu i 2) ustawienie metadanych dokumentu. 1) i 2) występują w oddzielnych połączeniach HTTP. Idealnie, chcę to zrobić za jednym razem, ale nie wiem, jak to zrobić.

Aby to wykonać, 1) kończy się sukcesem, aby dokument pojawił się w bibliotece. Następnie, gdy próbuję zaktualizować metadane, pojawia się błąd 409.

Jestem prawie pewien, że najpierw trzeba wstawić krok pomiędzy 1) i 2), który najpierw pobiera listę (lub manifest) dokumentu, który teoretycznie zawierałby potrzebne informacje o wersjach. Wszystko, co muszę zrobić, to ustawić potrzebne pola metadanych i odesłać je do serwera.

Nie, nie chcemy używać interfejsu API Sharepoint, ponieważ nie ma w nim bibliotek w Javie. ;-)

Powiązane problemy