2008-08-28 15 views
31

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

Después de las dos primeras respuestas ...

  • Definitivamente necesitamos usar la capa de servicio Web como vamos a hacer estas llamadas de aplicaciones de cliente remoto.

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

Hay, además, un servicio web para subir archivos, doloroso, pero funciona todo el tiempo.

¿Se refiere al servicio "Copiar"? Hemos tenido éxito con el método CopyIntoItems de este servicio. ¿Esta sería la forma recomendada de subir un archivo a las bibliotecas de documentos utilizando solo la API del servicio web de WSS?

He publicado nuestro código como respuesta sugerida.

Respuesta

17

Ejemplo de utilización del servicio Web WSS "Copiar" para cargar un documento en 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) 
    { 
     // ... 
    } 
} 
+0

¿Ha encontrado algún problema con los errores cuando el archivo ya existe? Empecé a usar esta técnica, pero descubrí que recibía constantemente un error "No se puede crear un elemento en el destino solicitado. Verifique que la carpeta exista y que tenga permiso para editarla". ¿Alguien más ha tenido este problema? – misteraidan

+1

ACTUALIZACIÓN: si destinationUrl es lo mismo que la url dentro de destinationUrls [], el error anterior se produce si el archivo/elemento ya existe .... (rant: ¿por qué no podemos editar comentarios ?!) – misteraidan

+0

No, yo nunca tuve tales problemas. Es el clásico error de "destino incorrecto", pero si está seguro de que el destino es correcto y de que tiene permiso, no puedo pensar qué más podría estar causando esto. –

1

Desde una compañera en el trabajo:

manera perezosa: la interfaz de sistema de archivos de Windows WebDAV. Es malo como una 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 obtenga la copia del archivo.

También hay un servicio web para cargar archivos, doloroso pero funciona todo el tiempo.

Creo que puede cargar archivos a través de la API de FrontPage pero no conozco a nadie que realmente lo use.

+0

Word, Excel (y otras aplicaciones de Office) usan la API de FrontPage como lo hacen muchas otras. En la versión 2010, se admitirá CMIS. –

1
No

seguro de exactamente qué servicio Web para utilizar, pero si usted está en una posición en la que puede utilizar las API de SharePoint Dlls NET, a continuación, utilizando el SPList y SPLibrary.Items.Add es muy fácil.

+0

No tengo idea de por qué esto fue votado: "Definitivamente necesitamos usar la capa del servicio web ya que realizaremos estas llamadas desde aplicaciones cliente remotas". –

+0

@MichaelBlackburn Porque si miras el historial de la pregunta, esa aclaración no se agregó a la pregunta hasta después de haber publicado mi respuesta. –

+0

Ah, mis disculpas. –

9

otra opción es utilizar ol llano' PUT HTTP:

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

Dónde puntos remoteFileURL a la biblioteca de documentos de SharePoint ...

+0

Sin embargo, acuerde con Erik E, para actualizar los metadatos necesitará crear otra versión (donde el control de versiones para la biblioteca doc está activado). Si hace esto, la primera versión será la Versión 2 (o 0.2). – misteraidan

+1

No estoy seguro de que esto sea cierto, ya que no creo que el "PUT" verifique en el archivo si el control de versiones está habilitado. Además, debería ser posible actualizar los metadatos sin crear una nueva versión utilizando el método SPListItem.SystemUpdate() ... –

+2

¿Esto requiere cambiar los permisos predeterminados en IIS? Estoy recibiendo una excepción 403 Forbidden cuando hago esto. – Jeremy

8

Hay un par de cosas a tener en cuenta:

  • Copy.CopyIntoItems necesita el documento para estar ya presente en algún servidor .El documento se pasa como un parámetro de la llamada al servicio web, que limitará el tamaño del documento. (Ver http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c)
  • el método 'http poner' (es decir, WebDAV ...) sólo poner el documento en la biblioteca, pero no establecer valores de campo
  • para actualizar los valores de campo puede llamar Lists.UpdateListItem después de la ' http puestas'
  • bibliotecas de documentos pueden tener directorios, puede hacerlos con 'http MKCOL'
  • es posible que desee comprobar en los archivos con Lists.CheckInFile
  • también puede crear un servicio web personalizada que utiliza el SPxxx. Net API, pero ese nuevo servicio web tendrá que estar instalado en el servidor. Podría ahorrar viajes al servidor.
+1

Para CopyIntoItems, la URL de origen es solo informativa. Los bits no provienen de otro servidor. –

+0

A partir de mis pruebas de hoy, la viñeta n.º 1 es incorrecta. Puede cargar un documento completamente nuevo en el servidor con Copy.CopyIntoItems. – retrodrone

+1

Tiene razón. Actualicé la respuesta, tenga en cuenta el problema de tamaño máximo. –

6
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: Cambio del 1er parámetro de CopyIntoItems al nombre del archivo, Path.GetFileName(destinationUrl), hace que el mensaje de desenlace desaparecer.

Cuestiones relacionadas