lunes, 13 de enero de 2014

Error: “value does not fall within the expected range” cuando intentamos subir un archivo a una biblioteca desde código en SharePoint 2013

Este error existe desde WSS 3.0 y puede deberse a muchas razones dependiendo del contexto del error. En esta caso es sobre una biblioteca de documentos que estamos intentando subir un archivo con código utilizando el Modelo de Objetos de Servidor de SharePoint.

El código de servidor para subir archivos a una biblioteca podemos encontrar en dos métodos mostrados a continuación:

SPFolder myLibrary = oWeb.Folders[documentLibraryName];
y 

SPFolder myLibrary = oWeb.GetList(URL OR NAME);
Pero al ejecutar la línea siguiente da el error:

SPFile spfile = libFolder.Files.Add(fileName, fileStream); 
Ambos son válidos y ambos pueden marcar el mismo error.   Desde la perspectiva de rendimiento utilizar GetList() es más eficiente que Folders[] por el simple echo que uno es un método que localiza el nombre de la biblioteca y el otro un arreglo de todas las bibliotecas del sitio y que debe de recorrer secuencialmente.
Bueno y donde esta el error, recordemos que el error indica que el valor no cae dentro del rango esperado.   Esto quiere decir que el Método Files.Add() no le parece el valor ingresado.  
Para saber donde esta el problema tenemos que revisar la sintaxis del método Add.  Que según la documentación de MSDN es la siguiente:
public SPFile Add(
string urlOfFile,
byte[] file
)
Donde el string espera una dirección URL relativa del archivo.  Que al final si ya estamos ubicados en el biblioteca no podemos volver a repetir la dirección URL relativa de toda la colección de sitios donde nos ubicarnos porque estaríamos duplicando la dirección y SharePoint valida que podemos subir un archivo si es una URL válida con lo cual no es.  Ya que SharePoint construye la ubicación basado en la ubicación de la biblioteca.  Entonces deducimos que la dirección URL relativa a la que se refiere la documentación es relativa a la biblioteca únicamente, y esto nos lleva a concluir que lo que espera el método SPFiles.Add() es únicamente el nombre del archivo.
La solución final es la siguiente:
using (SPSite oSiteCollection = new SPSite("http://localhost"))
{
using(SPWeb oWebsite = oSiteCollection.AllWebs["MyWebSite"])
{
SPWebCollection collWebsites = oWebsite.Webs;
SPFile oFile = oWebsite.GetFile("MyDocLib/MyFile");
foreach (SPWeb oWebsiteNext in collWebsites)
{
SPFolder oFolder = oWebsiteNext.GetFolder("Shared Documents");
SPFileCollection collFiles = oFolder.Files;

string strDestUrl = oFile.Name;
byte[] binFile = oFile.OpenBinary();
collFiles.Add(strDestUrl, binFile);

oWebsiteNext.Dispose();
}
}
}
NOTA: El código de arriba deberá de reemplazar los valores locales utilizados y la lógica de su código lo importante de notar en el código es el orden y el valor esperado por SPFiles.Add(), por lo que deberá variar su código del mostrado arriba.
SharePoint4Fun!,
Juan Manuel Herrera Ocheita

No hay comentarios.: