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
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 enLocal_Drive:\%WINDOWS%\assembly
del Explorador de Windows.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>
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;
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.
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; }
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