Freigeben über


SharePoint-Beispiel-Add-In für den Massenupload von Dokumenten

Hinweis

Das Beispiel lädt eine Datei in eine Dokumentbibliothek hoch. Wenn Sie mehrere Dateien hochladen möchten, müssen Sie das Beispiel erweitern.

Das Beispiel-Add-In "Core.BulkDocumentUploader" verwendet eine Konsolenanwendung, um Dateien mithilfe von REST-API-Aufrufen hochzuladen. Die Konfigurationseinstellungen werden in einer XML- und einer CSV-Datei festgelegt.

Verwenden Sie diese Lösung, wenn Folgendes auf Sie zutrifft:

  • Sie möchten Dateien zu SharePoint Online hochladen.
  • Sie möchten zu Office 365 migrieren und ein benutzerdefiniertes Migrationstool zum Verschieben Ihrer Dateien verwenden.

Bevor Sie beginnen

Laden Sie zunächst das Beispiel-Add-In Core.BulkDocumentUploader aus dem Projekt "Office 365-Entwicklermuster und -vorgehensweisen" auf GitHub herunter.

Hinweis

Der Code in diesem Artikel wird wie besehen und ohne jegliche Garantie zur Verfügung gestellt, gleich ob ausdrücklich oder konkludent, einschließlich jedweder stillschweigenden Gewährleistung der Eignung für einen bestimmten Zweck, Marktgängigkeit oder Nichtverletzung von Rechten.

Bevor Sie das Codebeispiel ausführen, führen Sie folgende Schritte aus:

  1. Bearbeiten Sie die Datei "OneDriveUploader.xml" unter Verwendung folgender Informationen:

    • Speicherort, an dem Sie Ihre Text- und CSV-Protokolldateien speichern möchten.
    • Dateipfad zur CSV-Zuordnungsdatei (z. B. "C:\PnP\Samples\Core.BulkDocumentUploader\Input\SharePointSites.csv)".
    • Speicherort der Unternehmensrichtliniendateien, die Sie hochladen möchten (z. B. "C:\PnP\Samples\Core.BulkDocumentUploader\Input\OneDriveFiles").
    • Ihre SharePoint Online-Anmeldeinformationen.
    • Auszuführende Dokumentenaktion (Hochladen oder Löschen).
    • Neuer Dateiname für die Datei nach dem Hochladen in die Dokumentbibliothek (z. B. "UNTERNEHMENSRICHTLINIEN-DOKUMENT.xlsx).
  2. Geben Sie in der SharePointSites.csv-Zuordnungsdatei die URL der Dokumentbibliothek, in die Sie Dateien hochladen möchten, und den Namen der hochzuladenden Unternehmensrichtliniendatei an.

  3. Fügen Sie den Dateipfad der "OneDriveUploader.xml"-Datei als Befehlszeilenargument hinzu. Öffnen Sie dazu die Projekteigenschaften von Core.BulkDocumentUploader im Projektmappen-Explorer, und wählen Sie dann Eigenschaften>Debuggen aus.

    Screenshot des Core.BulkDocumentUploader-Eigenschaftenbereich mit hervorgehobenem Debugging.

Verwenden des Core.BulkDocumentUploader-Beispiel-Add-Ins

Aus der Main-Methode in "Program.cs" ruft die RecurseActions-Methode die Run-Methode in OneDriveMapper.cs auf. Die Run-Methode erhält den Speicherort der hochzuladenden Datei aus "SharePointSites.csv" und ruft dann die IterateCollection-Methode auf.

public override void Run(BaseAction parentAction, DateTime CurrentTime, LogHelper logger)
        {
            CsvProcessor csvProcessor = new CsvProcessor();

            logger.LogVerbose(string.Format("Attempting to read mapping CSV file '{0}'", this.UserMappingCSVFile));

            using (StreamReader reader = new StreamReader(this.UserMappingCSVFile))
            {
                csvProcessor.Execute(reader, (entries, y) => { IterateCollection(entries, logger); }, logger);
            }
        }


Die Datei "SharePointSite.csv" enthält eine hochzuladende Datei und die Dokumentbibliothek, in die diese Datei hochgeladen werden soll. Die IterateCollection-Methode führt dann Folgendes aus, um die Datei in die Dokumentbibliothek hochzuladen:

  1. Ruft die hochzuladende Datei ab.

  2. Stellt sicher, dass der Benutzer über Berechtigungen zum Hinzufügen von Elementen verfügt.

  3. Erstellt das HttpWebRequest-Objekt mit dem Authentifizierungscookie, die REST-Zeichenfolgenanforderung zum Hochladen des Dokuments und die HTTP-Anforderungsaktionsmethode.

  4. Führt den Dateiupload aus.

Hinweis

Der Dateiname wird mit dem in OneDriveUploader.xml angegebenen Wert von FileUploadName überschrieben.

public override void IterateCollection(Collection<string> entries, LogHelper logger)
        {
            Stopwatch IterationSW = new Stopwatch();
            IterationSW.Start();

            logger.LogVerbose(string.Format(CultureInfo.CurrentCulture, "Establishing context object to: '{0}'", entries[this.SiteIndex]));

            try
            {
                // Use the context of the current iteration URL for current user item.
                using (ClientContext context = new ClientContext(entries[this.SiteIndex]))
                {
                    using (SecureString password = new SecureString())
                    {
                        foreach (char c in this.Password.ToCharArray())
                        {
                            password.AppendChar(c);
                        }

                        context.Credentials = new SharePointOnlineCredentials(this.UserName, password);

                        // Get the file to upload from the directory.
                        FileInfo theFileToUpload = new FileInfo(Path.Combine(this.DirectoryLocation + "\\", entries[this.FileIndex] + ".xlsx"));

                        logger.LogVerbose(string.Format(CultureInfo.CurrentCulture, "Attempting to {0} file {1}", this.DocumentAction, theFileToUpload));

                        // Ensure that the account has permissions to access.
                        BasePermissions perm = new BasePermissions();
                        perm.Set(PermissionKind.AddListItems);

                        ConditionalScope scope = new ConditionalScope(context, () => context.Web.DoesUserHavePermissions(perm).Value);

                        using(scope.StartScope())
                        {
                            Stopwatch tempSW = new Stopwatch();
                            tempSW.Start();

                            int success = 0;

                            while(tempSW.Elapsed.TotalSeconds < 20)
                            {
                                var digest = context.GetFormDigestDirect();

                                string cookie = ((SharePointOnlineCredentials)context.Credentials).GetAuthenticationCookie(new Uri(entries[this.SiteIndex])).TrimStart("SPOIDCRL=".ToCharArray());

                                using (Stream s = theFileToUpload.OpenRead())
                                {
                                    // Define REST string request to upload document to context. This string specifies the Documents folder, but you can specify another document library.
                                    string theTargetUri = string.Format(CultureInfo.CurrentCulture, "{0}/_api/web/lists/getByTitle('Documents')/RootFolder/Files/add(url='{1}',overwrite='true')?", entries[this.SiteIndex], this.FileUploadName);

                                    // Define REST HTTP request object.
                                    HttpWebRequest SPORequest = (HttpWebRequest)HttpWebRequest.Create(theTargetUri);

                                    // Define HTTP request action method.
                                    if (this.DocumentAction == "Upload")
                                    {
                                        SPORequest.Method = "POST";
                                    }
                                    else if (this.DocumentAction == "Delete")
                                    {
                                        SPORequest.Method = "DELETE";
                                    }
                                    else
                                    {
                                        logger.LogVerbose(string.Format(CultureInfo.CurrentCulture, "There was a problem with the HTTP request in DocumentAction attribute of XML file"));
                                        throw new Exception("The HTTP Request operation is not supported, please check the value of DocumentAction in the XML file");
                                    }

                                    // Build out additional HTTP request details.
                                    SPORequest.Accept = "application/json;odata=verbose";
                                    SPORequest.Headers.Add("X-RequestDigest", digest.DigestValue);
                                    SPORequest.ContentLength = s.Length;
                                    SPORequest.ContentType = "application/octet-stream";

                                    // Handle authentication to context through cookie.
                                    SPORequest.CookieContainer = new CookieContainer();
                                    SPORequest.CookieContainer.Add(new Cookie("SPOIDCRL", cookie, string.Empty, new Uri(entries[this.SiteIndex]).Authority));

                                    // Perform file upload/deletion.
                                    using (Stream requestStream = SPORequest.GetRequestStream())
                                    {
                                        s.CopyTo(requestStream);
                                    }

                                    // Get HTTP response to determine success of operation.
                                    HttpWebResponse SPOResponse = (HttpWebResponse)SPORequest.GetResponse();

                                    logger.LogVerbose(string.Format(CultureInfo.CurrentCulture, "Successfully '{0}' file {1}", this.DocumentAction, theFileToUpload));
                                    logger.LogOutcome(entries[this.SiteIndex], "SUCCCESS");

                                    success = 1;

                                    // Dispose of the HTTP response.
                                    SPOResponse.Close();

                                    break;
                                }
                                                       
                            }

                            tempSW.Stop();

                            if (success != 1)
                            {
                                throw new Exception("The HTTP Request operation exceeded the timeout of 20 seconds");
                            }

                        }
                    }
                }

            }
            catch(Exception ex)
            {
                logger.LogVerbose(string.Format(CultureInfo.CurrentCulture, "There was an issue performing '{0}' on to the URL '{1}' with exception: {2}", this.DocumentAction, entries[this.SiteIndex], ex.Message));
                logger.LogOutcome(entries[this.SiteIndex], "FAILURE");
            }
            finally
            {
                IterationSW.Stop();
                logger.LogVerbose(string.Format(CultureInfo.CurrentCulture, "Completed processing URL:'{0}' in {1} seconds", entries[this.SiteIndex], IterationSW.ElapsedMilliseconds/1000));
            }
        }

Siehe auch