2008-08-28 21 views
31

Jaki jest najlepszy sposób na przesłanie pliku do Biblioteki dokumentów na serwerze SharePoint za pośrednictwem wbudowanych usług WWW udostępnianych przez wersję WSS 3.0?Prześlij plik do programu SharePoint za pośrednictwem wbudowanych usług WWW.

Po pierwszych dwóch odpowiedzi ...

  • Zdecydowanie trzeba użyć warstwę Web Service jak będziemy dokonaniu tych połączeń z aplikacjami klienckimi zdalnych.

  • Metoda WebDAV przydałaby się nam, ale wolelibyśmy być zgodni z metodą integracji usług internetowych.

Istnieje dodatkowo serwis internetowy, aby przesłać pliki, bolesne, ale działa cały czas.

Czy odwołujesz się do usługi "Kopiuj"? Odnieśliśmy sukces dzięki tej usłudze w metodzie CopyIntoItems. Czy byłby to zalecany sposób przesyłania pliku do Biblioteki dokumentów przy użyciu tylko interfejsu API usługi WWW WSS?

Opublikowałem nasz kod jako sugerowaną odpowiedź.

Odpowiedz

17

Przykład korzystania z serwisu internetowego WSS „Kopiuj”, aby przesłać dokument do biblioteki ...

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) 
    { 
     // ... 
    } 
} 
+0

Czy znalazłeś jakieś problemy z błędami, gdy plik już istnieje? Zacząłem używać tej techniki, ale stwierdziłem, że ciągle otrzymuję komunikat "Nie mogę utworzyć elementu w żądanym miejscu docelowym. Sprawdź, czy folder istnieje i czy masz uprawnienia do edycji". Ktoś jeszcze miał ten problem? – misteraidan

+1

AKTUALIZACJA - jeśli destinationUrl jest taki sam jak adres URL wewnątrz przeznaczeniaUrls [], powyższy błąd zostanie zgłoszony, jeśli plik/element już istnieje .... (rant: dlaczego nie możemy edytować komentarzy ?!) – misteraidan

+0

Nie, I nigdy nie miałem takich problemów. To jest twój klasyczny błąd "złego przeznaczenia", ale jeśli jesteś pewien, że miejsce docelowe jest poprawne i masz pozwolenie, nie mogę myśleć, co jeszcze może być przyczyną tego. –

1

Z colleage pracy:

Lazy sposób: Twój interfejs systemu plików WebDAV systemu Windows. Jest to złe rozwiązanie programowe, ponieważ opiera się na usłudze WindowsClient działającej w systemie operacyjnym, a działa tylko w witrynach działających na porcie 80. Zamapuj dysk do biblioteki dokumentów i uzyskaj dostęp do kopii pliku.

Istnieje również serwis internetowy do przesyłania plików, bolesny, ale działa cały czas.

Uważam, że możesz przesyłać pliki za pośrednictwem interfejsu API FrontPage, ale nie znam nikogo, kto faktycznie go używa.

+0

Word, Excel (i inne aplikacje Office) korzystają z interfejsu FrontPage API, podobnie jak wiele innych. W wersji 2010 CMIS będzie obsługiwany. –

1

Nie wiesz, na jakie dokładnie Web Service w użyciu, ale jeśli jesteś w sytuacji, w której można korzystać z bibliotek dll .NET API programu SharePoint, a następnie za pomocą SPList i SPLibrary.Items.Add jest naprawdę proste.

+0

Nie mam pojęcia, dlaczego zostało to wznowione: "Zdecydowanie musimy użyć warstwy usługi sieciowej, ponieważ będziemy wykonywać te połączenia ze zdalnych aplikacji klienckich." –

+0

@MichaelBlackburn Ponieważ jeśli spojrzysz na historię pytania, to wyjaśnienie nie zostało dodane do pytania, dopóki nie opublikuję odpowiedzi. –

+0

Ach, moje przeprosiny. –

9

Inną opcją jest użycie zwykłego ol”PUT http:

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

Gdzie punkty remoteFileURL do biblioteki dokumentów programu SharePoint ...

+0

Zgadzam się z Erikiem E, aby następnie zaktualizować metadane, które będą potrzebne do utworzenia kolejnej wersji (w której włączono sprawdzanie wersji dla biblioteki dokumentów). Jeśli to zrobisz, pierwszą wersją będzie wersja 2 (lub 0.2). – misteraidan

+1

Nie jestem pewien, czy to prawda, ponieważ nie sądzę, że "PUT" sprawdzi w pliku, jeśli włączono obsługę wersji. Ponadto powinna istnieć możliwość aktualizacji metadanych bez tworzenia nowej wersji przy użyciu metody SPListItem.SystemUpdate() ... –

+2

Czy wymaga to zmiany domyślnych uprawnień w IIS? Podczas wykonywania tej czynności otrzymuję zabroniony wyjątek 403. – Jeremy

8

Istnieje kilka rzeczy do rozważenia:

  • Copy.CopyIntoItems potrzebuje dokument będzie już obecny na jakimś serwerze .Dokument jest przekazywany jako parametr wywołania usługi sieciowej, co ogranicza rozmiar dokumentu. (Patrz http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c)
  • metodę „http umieścić” (tj WebDAV ...) położy tylko dokument w bibliotece, ale nie ustawić pole wartości
  • aktualizacji wartości pól można nazwać Lists.UpdateListItem po ' http przeszukiwania”
  • biblioteki dokumentów może mieć katalogi, można zrobić je z«http mkcol»
  • może chcesz sprawdzić w pliki Lists.CheckInFile
  • można również utworzyć niestandardową usługa, która używa SPxxx. Net API, ale ta nowa usługa sieciowa będzie musiała być zainstalowana na serwerze. Może to zaoszczędzić na wycieczkach na serwer.
+1

Dla CopyIntoItems adres źródłowy jest tylko informacyjny. Bity nie pochodzą z innego serwera. –

+0

Z moich testów dzisiaj, bullet # 1 jest niepoprawny. Możesz przesłać całkowicie nowy dokument na serwer za pomocą Copy.CopyIntoItems. – retrodrone

+1

Masz rację. Zaktualizowałem odpowiedź, proszę zwrócić uwagę na problem z maksymalnym rozmiarem. –

6
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); 
} 

UWAGA: Zmiana 1st parametr CopyIntoItems do nazwy pliku, Path.GetFileName(destinationUrl) sprawia, że ​​odłączenie komunikat zniknie.

Powiązane problemy