Compartir vía


Complemento de SharePoint de carga en masa de una muestra de documentos

Nota:

El ejemplo carga un archivo en una biblioteca de documentos. Para cargar varios archivos, debe ampliar el ejemplo.

El complemento de ejemplo Core.BulkDocumentUploader usa una aplicación de consola para cargar archivos mediante llamadas a API de REST. Las opciones de configuración se especifican en un XML y un archivo CSV.

Use esta solución si quiere:

  • Cargar archivos en SharePoint Online.
  • Migrar a Office 365 y usar una herramienta de migración personalizada para mover los archivos.

Antes de empezar

Para empezar, descargue el complemento de ejemplo Core.BulkDocumentUploader desde el proyecto Modelos y prácticas de desarrollo de Office 365 en GitHub.

Nota:

El código de este artículo se proporciona tal cual, sin garantía de ningún tipo, expresa o implícita, incluidas las garantías implícitas de aptitud para un propósito particular, comerciabilidad o ausencia de infracción.

Antes de ejecutar el código de ejemplo, haga lo siguiente:

  1. Edite el archivo OneDriveUploader.xml con la siguiente información:

    • La ubicación donde quiere guardar los archivos de texto y los archivos de registro CSV.
    • La ruta de acceso del archivo para el archivo de asignación CSV (por ejemplo, C:\PnP\Samples\Core.BulkDocumentUploader\Input\SharePointSites.csv).
    • La ubicación de los archivos de directivas de la compañía que quiere cargar (por ejemplo, C:\PnP\Samples\Core.BulkDocumentUploader\Input\OneDriveFiles).
    • Sus credenciales de SharePoint Online.
    • La acción del documento para realizar (carga o eliminar).
    • El nuevo nombre para aplicar al archivo después de cargarlo a la biblioteca de documentos (por ejemplo, COMPANY POLICY DOCUMENT.xlsx).
  2. En el archivo de asignación SharePointSites.csv liste la dirección URL de la biblioteca de documentos a la que va a cargar archivos y el nombre del archivo de directiva de compañía que quiere cargar.

  3. Agregue la ruta de acceso del archivo OneDriveUploader.xml como un argumento de línea de comandos. Para ello, abra las propiedades del proyecto Core.BulkDocumentUploader en el Explorador de soluciones y después elija Propiedades>Depurar.

    Captura de pantalla del panel de propiedades de Core.BulkDocumentUploader con Depurar resaltado.

Uso del complemento de ejemplo de Core.BulkDocumentUploader

Desde el método Main en Program.cs, el método RecurseActions llama al método Run en OneDriveMapper.cs. El método Run obtiene la ubicación del archivo que se carga desde SharePointSites.csv y luego llama al método IterateCollection.

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


El archivo SharePointSite.csv muestra un archivo para cargarlo y la biblioteca de documentos donde se va a cargar el archivo. A continuación, el método IterateCollection hace lo siguiente para cargar el archivo en la biblioteca de documentos:

  1. Obtiene el archivo para cargar.

  2. Garantiza que el usuario tiene permisos para agregar elementos.

  3. Crea el objeto HttpWebRequest con la cookie de autenticación, la solicitud de cadena de REST para cargar el documento y el método de acción de solicitud HTTP.

  4. Realiza la carga del archivo.

Nota:

El nombre del archivo se sobrescribe con el valor de FileUploadName especificado en OneDriveUploader.xml.

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

Vea también