Compartir a través de


Procedimiento para cargar un archivo en un sitio de SharePoint desde una carpeta local

En esta tarea de programación se muestra cómo cargar un archivo desde una carpeta local en una carpeta de un sitio de Windows SharePoint Services. La tarea usa el método EnsureParentFolder para garantizar que existe la carpeta de destino.

Procedimientos

Para cargar un archivo en una carpeta de un sitio de SharePoint desde una carpeta local

  1. Cree una aplicación web en Visual Studio 2005 como se describe en Procedimiento para crear una aplicación web en un sitio web de SharePoint y agregue un control FormDigest y una directiva de página para el espacio de nombres Microsoft.SharePoint.WebControls al archivo .aspx de la siguiente manera:

    <%@ Register Tagprefix="SharePoint" 
          Namespace="Microsoft.SharePoint.WebControls" 
       Assembly="Microsoft.SharePoint, Version=12.0.0.0, 
          Culture=neutral, 
       PublicKeyToken=71e9bce111e9429c" %>
    

    Nota

    Puede obtener el valor PublicKeyToken de la implementación Windows SharePoint Services actual desde el archivo default.aspx de la carpeta Local_Drive:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\SiteTemplates\sts o desde la información proporcionada para el ensamblado Microsoft.SharePoint en Local_Drive:\%WINDOWS%\assembly del Explorador de Windows.

  2. Agregue un control HtmlInputFile, un cuadro de texto y un botón al formulario en la página .aspx:

    <form id="Form1" method="post" runat="server">
       <SharePoint:FormDigest runat="server" />
       <input id="File1" type="file" runat="server" title="upldFileBox">
       <asp:Button id="Button1" runat="server" 
          Text="Upload File"></asp:Button>
       <asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
    </form>
    
  3. En el archivo aspx.cs de código subyacente, agregue directivas using para los espacios de nombres System.IO y Microsoft.SharePoint de la manera siguiente:

    Imports System.IO
    Imports Microsoft.SharePoint
    
    using System.IO;
    using Microsoft.SharePoint;
    
  4. Agregue el siguiente código al evento Click para el botón:

    If File1.PostedFile Is Nothing Then
        Return
    End If 
    
    Dim destUrl As String = TextBox1.Text
    
    Dim site As SPWeb = New SPSite(destUrl).OpenWeb()
    
    Dim fStream As Stream = File1.PostedFile.InputStream
    Dim contents(fStream.Length) As Byte
    
    fStream.Read(contents, 0, CInt(fStream.Length))
    fStream.Close()
    
    EnsureParentFolder(site, destUrl)
    
    site.Files.Add(destUrl, contents)
    
    if (File1.PostedFile == null)
        return;
    
    string destUrl = TextBox1.Text;
    
    SPWeb site = new SPSite(destUrl).OpenWeb();
    
    Stream fStream = File1.PostedFile.InputStream;
    byte[] contents = new byte[fStream.Length];
    
    fStream.Read(contents, 0, (int)fStream.Length);
    fStream.Close(); 
    
    EnsureParentFolder(site, destUrl);
    
    site.Files.Add(destUrl, contents);
    

    El valor que se escribe en el cuadro de texto para el destino debe ser una dirección URL absoluta, incluido el nombre de archivo, que se asigna al parámetro destUrl .

    Además de crear instancias de un objeto SPWeb para el sitio primario, el uso combinado del constructor SPSite y del método OpenWeb valida la dirección URL y genera una excepción de argumento si la implementación de Windows SharePoint Services actual no presenta la dirección URL. Se usa un objeto System.Web.UI.HtmlControls.HtmlInputFile para leer el archivo de código fuente en una matriz de bytes para usarlo con el método Add de la clase SPFileCollection.

  5. El método EnsureParentFolder garantiza que la carpeta principal de la dirección URL de destino existe en el sitio especificado y devuelve la dirección URL relativa al sitio de la carpeta principal. El método EnsureParentFolder acepta dos parámetros: un objeto SPWeb que representa el sitio principal y una cadena que contiene la dirección URL absoluta que se pasa desde el método UploadFile. Si la carpeta principal no existe, el método EnsureParentFolder la crea.

    Public Function EnsureParentFolder(parentSite As SPWeb, 
            destinUrl As String) As String
    
        destinUrl = parentSite.GetFile(destinUrl).Url
    
        Dim index As Integer = destinUrl.LastIndexOf("/")
        Dim parentFolderUrl As String = String.Empty
    
        If index > - 1 Then
            parentFolderUrl = destinUrl.Substring(0, index)
            Dim parentFolder As SPFolder 
                = parentSite.GetFolder(parentFolderUrl)
    
            If Not parentFolder.Exists Then
                Dim currentFolder As SPFolder = parentSite.RootFolder
                Dim folder As String
    
                For Each folder In  parentFolderUrl.Split("/"c)
                    currentFolder = currentFolder.SubFolders.Add(folder)
                Next folder
            End If
        End If
    
        Return parentFolderUrl
    End Function 'EnsureParentFolder
    
    public string EnsureParentFolder(SPWeb parentSite, string destinUrl)
    {
        destinUrl = parentSite.GetFile(destinUrl).Url;
    
        int index = destinUrl.LastIndexOf("/");
        string parentFolderUrl = string.Empty;
    
        if (index > -1)
        {
            parentFolderUrl = destinUrl.Substring(0, index);
    
            SPFolder parentFolder 
                = parentSite.GetFolder(parentFolderUrl);
    
            if (! parentFolder.Exists)
            {
                SPFolder currentFolder = parentSite.RootFolder;
    
                foreach(string folder in parentFolderUrl.Split('/'))
                {
                    currentFolder 
                        = currentFolder.SubFolders.Add(folder);
                }
            }
        }
        return parentFolderUrl;
    }
    
  6. El método GetFile de la clase SPWeb se usa en combinación con la propiedad Url de la clase SPFile para convertir la dirección URL a una dirección URL relativa al sitio, lo cual genera una excepción si la dirección URL especificada no se encuentra dentro del ámbito del sitio. La dirección URL de la carpeta principal se calcula mediante el método String.LastIndexOf, que determina la última vez que aparece una barra diagonal (/) dentro de la dirección URL de destino. Si no hay ninguna barra diagonal (es decir, si el índice es igual a-1), el destino es la carpeta raíz del sitio y el parámetro parentFolderUrl devuelve una cadena vacía. De lo contrario, en el ejemplo se usa el método GetFolder de la clase SPWeb para devolver la carpeta principal de destino. Si la carpeta no existe, se crea en el ejemplo.

Para cargar un archivo desde una carpeta local en el mismo servidor que ejecuta Windows SharePoint Services, puede usar un objeto System.IO.FileStream en su lugar. En este caso, agregue una directiva using al espacio de nombres System.IO, además de las directivas System y Microsoft.SharePoint. En el ejemplo siguiente se usa el controlador de eventos Click para llamar a un método UploadFile que, a su vez, llama al método EnsureParentFolder descrito anteriormente.

Public Sub UploadFile(srcUrl As String, destUrl As String)

    If Not File.Exists(srcUrl) Then

        Throw New ArgumentException(String.Format("{0} does not exist", 
            srcUrl), "srcUrl")

    End If

    Dim site As SPWeb = New SPSite(destUrl).OpenWeb()

    Dim fStream As FileStream = File.OpenRead(srcUrl)
    Dim contents(fStream.Length) As Byte
    fStream.Read(contents, 0, CInt(fStream.Length))
    fStream.Close()

    EnsureParentFolder(site, destUrl)

    site.Files.Add(destUrl, contents)

End Sub 'UploadFile
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);
}

El método UploadFile acepta dos parámetros. El parámetro srcUrl especifica la ruta de acceso de la ubicación de origen en el sistema de archivos del equipo local y el parámetro destUrl especifica la dirección URL absoluta de destino. Se usa un objeto System.IO.FileStream para leer el archivo de origen en una matriz de bytes para usarlo con el método Add de la clase SPFileCollection.

Nota

El tamaño del archivo que se carga no puede superar 2 GB.

Vea también

Otros recursos

Trabajar con objetos de listas y colecciones
Introducción a la personalización mediante programación de un sitio web de SharePoint en Visual Studio
Validación de seguridad y realización de envíos para actualizar datos
Concesión de privilegio