Compartir a través de


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

Última modificación: miércoles, 07 de julio de 2010

Hace referencia a: SharePoint Foundation 2010

Disponible en SharePoint Online

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

Procedimientos

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

  1. Cree una página de aplicación en Microsoft Visual Studio 2010, como se describe en el tema sobre la creación de páginas de aplicaciones para SharePoint.

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

    <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 de código subyacente .aspx.cs, 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 SharePoint Foundation actual no presenta la dirección URL. Se usa un objeto HtmlInputFile para leer el archivo de origen 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 del ejemplo. 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 que se encuentra en el mismo servidor que ejecuta SharePoint Foundation, puede usar un objeto FileStream en su lugar. En este caso, agregue una directiva using al espacio de nombres System.IO, además de las directivas para System y Microsoft.SharePoint. En el ejemplo siguiente se usa el controlador de eventos Click para llamar a un método UploadFile personalizado 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 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

Conceptos

Trabajar con objetos de listas y colecciones

Uso de Visual Studio para el desarrollo de SharePoint

Validación de seguridad y realización de envíos para actualizar datos

Concesión de privilegio