Pregunta

¿Cuál es la mejor manera de cargar un archivo en una biblioteca de documentos en un servidor SharePoint a través de los servicios web integrados que expone la versión WSS 3.0?

Siguiendo las dos respuestas iniciales...

  • Definitivamente necesitamos usar la capa de servicio web ya que realizaremos estas llamadas desde aplicaciones cliente remotas.

  • El método WebDAV funcionaría para nosotros, pero preferiríamos ser coherentes con el método de integración de servicios web.

Además, hay un servicio web para cargar archivos, que es complicado pero funciona todo el tiempo.

¿Te refieres al servicio “Copiar”?Hemos tenido éxito con este servicio. CopyIntoItems método.¿Sería esta la forma recomendada de cargar un archivo en las bibliotecas de documentos utilizando únicamente la API del servicio web WSS?

He publicado nuestro código como respuesta sugerida.

¿Fue útil?

Solución

Ejemplo de uso del servicio web WSS "Copiar" para subir un documento a una biblioteca...

public static void UploadFile2007(string destinationUrl, byte[] fileData)
{
    // List of desination Urls, Just one in this example.
    string[] destinationUrls = { Uri.EscapeUriString(destinationUrl) };

    // Empty Field Information. This can be populated but not for this example.
    SharePoint2007CopyService.FieldInformation information = new 
        SharePoint2007CopyService.FieldInformation();
    SharePoint2007CopyService.FieldInformation[] info = { information };

    // To receive the result Xml.
    SharePoint2007CopyService.CopyResult[] result;

    // Create the Copy web service instance configured from the web.config file.
    SharePoint2007CopyService.CopySoapClient
    CopyService2007 = new CopySoapClient("CopySoap");
    CopyService2007.ClientCredentials.Windows.ClientCredential = 
        CredentialCache.DefaultNetworkCredentials;
    CopyService2007.ClientCredentials.Windows.AllowedImpersonationLevel = 
        System.Security.Principal.TokenImpersonationLevel.Delegation;

    CopyService2007.CopyIntoItems(destinationUrl, destinationUrls, info, fileData, out result);

    if (result[0].ErrorCode != SharePoint2007CopyService.CopyErrorCode.Success)
    {
        // ...
    }
}

Otros consejos

Otra opción es utilizar HTTP PUT simple:

WebClient webclient = new WebClient();
webclient.Credentials = new NetworkCredential(_userName, _password, _domain);
webclient.UploadFile(remoteFileURL, "PUT", FilePath);
webclient.Dispose();

Donde remotoFileURL apunta a su biblioteca de documentos de SharePoint...

Hay un par de cosas a considerar:

  • Copiar.CopyIntoItems necesita que el documento ya esté presente en algún servidor.El documento se pasa como parámetro de la llamada al servicio web, lo que limitará el tamaño que puede tener el documento.(Ver http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c)
  • el método 'http put' (es decir, webdav...) sólo colocará el documento en la biblioteca, pero no establecerá valores de campo
  • para actualizar los valores de los campos, puede llamar a Lists.UpdateListItem después de 'http put'
  • Las bibliotecas de documentos pueden tener directorios, puedes crearlos con 'http mkcol'
  • es posible que desee registrar archivos con Lists.CheckInFile
  • También puede crear un servicio web personalizado que utilice la API SPxxx .Net, pero ese nuevo servicio web deberá instalarse en el servidor.Podría ahorrar viajes al servidor.
public static void UploadFile(byte[] fileData) {
  var copy = new Copy {
    Url = "http://servername/sitename/_vti_bin/copy.asmx", 
    UseDefaultCredentials = true
  };

  string destinationUrl = "http://servername/sitename/doclibrary/filename";
  string[] destinationUrls = {destinationUrl};

  var info1 = new FieldInformation
                {
                  DisplayName = "Title", 
                  InternalName = "Title", 
                  Type = FieldType.Text, 
                  Value = "New Title"
                };

  FieldInformation[] info = {info1};
  var copyResult = new CopyResult();
  CopyResult[] copyResults = {copyResult};

  copy.CopyIntoItems(
    destinationUrl, destinationUrls, info, fileData, out copyResults);
}

NOTA: Cambiar el primer parámetro de CopyIntoItems al nombre del archivo, Path.GetFileName(destinationUrl), hace que desaparezca el mensaje de desvinculación.

Tuve buena suerte al usar la clase contenedora DocLibHelper que se describe aquí: http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html

De un colega en el trabajo:

Manera perezosa:la interfaz del sistema de archivos WebDAV de Windows.Es mala como solución programática porque depende del servicio WindowsClient que se ejecuta en su sistema operativo y también solo funciona en sitios web que se ejecutan en el puerto 80.Asigne una unidad a la biblioteca de documentos y comience a copiar el archivo.

Además, hay un servicio web para cargar archivos, que es complicado pero funciona todo el tiempo.

Creo que puedes cargar archivos a través de la API de FrontPage, pero no conozco a nadie que realmente la utilice.

No estoy seguro de exactamente qué servicio web usar, pero si está en una posición en la que puede usar las DLL API de SharePoint .NET, entonces usar SPList y SPLibrary.Items.Add es realmente fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top