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