none
Brauche Vorschläge: Dokumentenupload per Webservice oder ähnlichem RRS feed

  • Frage

  • Hallo zusammen,

    wir haben einen Workflow über den unsere User Daten erfassen können, diese werden dann in eine SharePoint Liste geschrieben (per Webservice). Jetzt sollen die User die Möglichkeit bekommen über unseren Workflow auch ein Dokument in eine SharePoint Bibliothek zu laden. Am Besten natürlich auch per Webservice. Meine Recherche im Internet hat ergeben, dass es aber direkt keinen eigenen Webservice für den Dokumente Upload gibt....Stimmt das so noch?

    Eine weitere Möglichkeit wäre eine EMail zu generieren, an den SharePoint zu schicken und der packt die dann in die entsprechende Bibliothek. Ich würds aber gern anders lösen, hat jemand einen Vorschlag oder Tips?

    Vielen Dank im Voraus
    Philip

    Mittwoch, 13. Juni 2012 10:56

Antworten

  • Wenn du nur Vorschläge brauchst, ohne direkte Implementierungsmöglichkeiten, dann wäre die Erstellung eines eigenen WebService für SharePoint sicherlich die erste Wahl. So, wie deine Frage klingt, kennst du dich da ein wenig aus und könntest schnell was zaubern. Eine Anleitung zur Erstellung von ASP.NET-Web Services für den SharePoint findest du hier. Auch wenn sie irgendwann etwas kompliziert wird, sie funktioniert. Wenn der Service implementiert ist (ich hab das Beispiel benutzt, um mittels Guid einer DokBib und ID eines Items, dessen File-Objekt nach PDF zu exportieren und in der gleichen DokBib abzulegen), kannst du dir ja überlegen, wie du den ansprechbar machst, z.B. über kleine Webparts direkt auf dem SharePoint oder irgendwelche WinForms, WPF, Silverlight, ... Client-Anwendungen für die Systeme, der Kollegen.

    Architektonisch gesehen benötigst du eine Komponente, die die Upload Logik implementiert, eine, die diese Logik als WebService auf dem SharePoint verfügbar macht und eine ClientAnwendung, die sie nutzt. Alle drei für sich genommen bilden lösbare Arbeitspakete und deren Zusammenspiel idealerweise das, was du benötigst.

    beste Grüße!

    Peter

    Dienstag, 19. Juni 2012 08:39
  • Hallo,

    wir haben das nun schon diverse male mit dem Copy Webservice von Sharepoint gelöst. Wenn source und quelle gleich gesetzt werden, kann man damit ne menge erreichen. Wir führen mit dieser Technik auch massenuploads durch. Hier mal ein Beispiel (ist allerdings etwas spezifisch, die idee sollte aber klar werden).

    public

    voidCreateNewDocumentWithCopyService(byte[] file, List<MetaData> metaData, stringtitle)

            {

               

    byte[] myBinary = file;

               

    stringdestination = (AdditionalMail.WebUrl.EndsWith("/") ? AdditionalMail.WebUrl : AdditionalMail.WebUrl + "/") + AdditionalMail.Libraryname + "/"+ System.IO.Path.GetFileName(title);

               

    string[] destinationUrl = { destination };

               

    List<Copy.FieldInformation> items = newList<Copy.FieldInformation>();

               

    foreach(MetaData attributes inmetaData)

                {

                    Copy.FieldInformation info =

    newCopy.FieldInformation();

                    info.DisplayName = attributes.DisplayName;

                    info.InternalName = attributes.Name;

                    info.Type = MappingHelper.MapFieldTypeToCopyServiceType(attributes.FieldType);

                    info.Value = attributes.Value;

                    items.Add(info);

                }

                Copy.FieldInformation[] infos = items.ToArray();

               

    try


                {

                    Copy.CopySoapClient csc =

    newCopy.CopySoapClient();

                    System.ServiceModel.EndpointAddress addr =

    newSystem.ServiceModel.EndpointAddress(AdditionalMail.WebUrl + "/_vti_bin/copy.asmx");

                    csc.Endpoint.Address = addr;

                    csc.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.

    TokenImpersonationLevel.Delegation;

                    csc.CopyIntoItemsCompleted +=

    newEventHandler<Copy.CopyIntoItemsCompletedEventArgs>(csc_CopyIntoItemsCompleted2);

                    csc.CopyIntoItemsAsync(destination, destinationUrl, infos, myBinary);

                }

               

    catch(Exceptionex)

                {

                }

            }

           

    voidcsc_CopyIntoItemsCompleted2(objectsender, Copy.CopyIntoItemsCompletedEventArgs e)

            {

               

    if(e.Error == null)

                {

                   

    string[] paths = e.Results[0].DestinationUrl.Split('/');

                   

    stringfileName = (string)paths.GetValue(paths.Length - 1);

                    SetCheckBoxEvent(

    this, newSetCheckBoxEventArtgs() { FileName = fileName });

                }

               

    else


                {

                }

            }

    Hoffe das hilft.

    Frank

    Mittwoch, 20. Juni 2012 09:43

Alle Antworten

  • Wenn du nur Vorschläge brauchst, ohne direkte Implementierungsmöglichkeiten, dann wäre die Erstellung eines eigenen WebService für SharePoint sicherlich die erste Wahl. So, wie deine Frage klingt, kennst du dich da ein wenig aus und könntest schnell was zaubern. Eine Anleitung zur Erstellung von ASP.NET-Web Services für den SharePoint findest du hier. Auch wenn sie irgendwann etwas kompliziert wird, sie funktioniert. Wenn der Service implementiert ist (ich hab das Beispiel benutzt, um mittels Guid einer DokBib und ID eines Items, dessen File-Objekt nach PDF zu exportieren und in der gleichen DokBib abzulegen), kannst du dir ja überlegen, wie du den ansprechbar machst, z.B. über kleine Webparts direkt auf dem SharePoint oder irgendwelche WinForms, WPF, Silverlight, ... Client-Anwendungen für die Systeme, der Kollegen.

    Architektonisch gesehen benötigst du eine Komponente, die die Upload Logik implementiert, eine, die diese Logik als WebService auf dem SharePoint verfügbar macht und eine ClientAnwendung, die sie nutzt. Alle drei für sich genommen bilden lösbare Arbeitspakete und deren Zusammenspiel idealerweise das, was du benötigst.

    beste Grüße!

    Peter

    Dienstag, 19. Juni 2012 08:39
  • Hallo,

    wir haben das nun schon diverse male mit dem Copy Webservice von Sharepoint gelöst. Wenn source und quelle gleich gesetzt werden, kann man damit ne menge erreichen. Wir führen mit dieser Technik auch massenuploads durch. Hier mal ein Beispiel (ist allerdings etwas spezifisch, die idee sollte aber klar werden).

    public

    voidCreateNewDocumentWithCopyService(byte[] file, List<MetaData> metaData, stringtitle)

            {

               

    byte[] myBinary = file;

               

    stringdestination = (AdditionalMail.WebUrl.EndsWith("/") ? AdditionalMail.WebUrl : AdditionalMail.WebUrl + "/") + AdditionalMail.Libraryname + "/"+ System.IO.Path.GetFileName(title);

               

    string[] destinationUrl = { destination };

               

    List<Copy.FieldInformation> items = newList<Copy.FieldInformation>();

               

    foreach(MetaData attributes inmetaData)

                {

                    Copy.FieldInformation info =

    newCopy.FieldInformation();

                    info.DisplayName = attributes.DisplayName;

                    info.InternalName = attributes.Name;

                    info.Type = MappingHelper.MapFieldTypeToCopyServiceType(attributes.FieldType);

                    info.Value = attributes.Value;

                    items.Add(info);

                }

                Copy.FieldInformation[] infos = items.ToArray();

               

    try


                {

                    Copy.CopySoapClient csc =

    newCopy.CopySoapClient();

                    System.ServiceModel.EndpointAddress addr =

    newSystem.ServiceModel.EndpointAddress(AdditionalMail.WebUrl + "/_vti_bin/copy.asmx");

                    csc.Endpoint.Address = addr;

                    csc.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.

    TokenImpersonationLevel.Delegation;

                    csc.CopyIntoItemsCompleted +=

    newEventHandler<Copy.CopyIntoItemsCompletedEventArgs>(csc_CopyIntoItemsCompleted2);

                    csc.CopyIntoItemsAsync(destination, destinationUrl, infos, myBinary);

                }

               

    catch(Exceptionex)

                {

                }

            }

           

    voidcsc_CopyIntoItemsCompleted2(objectsender, Copy.CopyIntoItemsCompletedEventArgs e)

            {

               

    if(e.Error == null)

                {

                   

    string[] paths = e.Results[0].DestinationUrl.Split('/');

                   

    stringfileName = (string)paths.GetValue(paths.Length - 1);

                    SetCheckBoxEvent(

    this, newSetCheckBoxEventArtgs() { FileName = fileName });

                }

               

    else


                {

                }

            }

    Hoffe das hilft.

    Frank

    Mittwoch, 20. Juni 2012 09:43