2008-11-24 15 views
13

Estoy creando algunos archivos grandes (exportaciones DB) con Java y necesito ubicarlos en algún lugar de nuestro servidor SharePoint. En este momento, estoy haciendo esto con IE, pero también me gustaría automatizar este paso.¿Cómo cargo un documento a SharePoint con Java?

Busqué en la web y encontré algunos consejos para usar SOAP, pero aún no veo el terreno para todo esto. ¿Alguien puede proporcionarme un código de muestra o una receta de lo que debo hacer?

Tenga en cuenta que el servidor de SharePoint solicita la autenticación de dominio NT. Ni siquiera se puede iniciar sesión con Firefox :(

EDITAR

  • ¿Cómo se convierte la URL miedo en el IE en un camino de WebDAV?
  • ¿Existe un WebDAV "explorador", que pueda ? utilizar antes de arruinar el sistema de producción con mi código probé "DAV Explorador de 0,91" de http://www.davexplorer.org/ pero que no puede conectarse (probablemente a causa de autenticación de dominio NT)

Respuesta

3

Bien ...después de varias horas de trabajo y mordiéndome a mí mismo a través de la "documentación" que proporciona MicroSoft y todos los consejos distribuidos aleatoriamente en la red, he logrado escribir algunos ejemplos de código para examinar el contenido de un servidor de SharePoint: Navigating SharePoint Folders With Axis2.

Siguiente parada: cargando algo.

1

puedo pensar en diferentes opciones:.

  • Asignación de la biblioteca de documentos a una unidad de archivos y simplemente guarde el archivo como cualquier otro archivo en el sistema de archivos.
  • Usando el protocolo HTTP WebDAV.

... y por la parte de autenticación NTLM:

http://www.luigidragone.com/networking/ntlm.html

7

Además de Sacha's suggestions, puede utilizar los servicios web de SharePoint SOAP. Cada sitio de SharePoint expone un grupo de servicios web a través de la ruta http://<Site>/_vti_bin/.

En su caso, es probable que desee el Lists web service (http://<Site>/_vti_bin/Lists.asmx). Puede tomar el WSDL desde http://<Site>/_vti_bin/Lists.asmx?WSDL. El SDK de WSS 3.0 tiene detalles sobre cómo usar el servicio web (es probable que desee utilizar los métodos UpdateListItems y AddAttachment).

Dicho todo esto, la primera opción de Sacha (mapear una biblioteca de documentos en un disco) es probablemente la manera más fácil asumiendo que puede solucionar los problemas NTLM.

Si está utilizando Windows, puede simplemente navegar a una ruta UNC para una biblioteca de documentos. Por ejemplo, si la URL del navegador para su biblioteca de documentos es:

http://<Site>/Foo/BarDocs/Forms/AllItems.aspx

puede simplemente escriba la ruta correspondiente UNC en la barra de direcciones del Explorador de Windows:

\\<Site>\Foo\BarDocs

y luego arrastrar y soltar archivos a esta ubicación. Si desea, puede asignar esta ubicación a una letra de unidad con Windows Explorer o la utilidad de línea de comandos SUBST.EXE.

+1

UNC no funciona; ¿desde cuándo está disponible? Estoy en XP y no tengo idea de qué versión de SP está en uso. –

+0

La descarga de WSDL funciona, pero tampoco hay información de versión:/ –

+0

Me doy cuenta de que esto es mucho más tarde, pero el camino de UNC funcionó para mí. Pude usar esa ruta con la API IO de Java para escribir documentos directamente en Sharepoint. +1 – RustyTheBoyRobot

3

Otra solución es usar HTTP PUT método para enviar un archivo directamente al Sharepoint.

Para que pueda utilizar Apache HTTP Client:

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.2.3</version> 
</dependency> 

Y para permitir la autenticación NTLMv2 necesita JCIF biblioteca.

<dependency> 
    <groupId>jcifs</groupId> 
    <artifactId>jcifs</artifactId> 
    <version>1.3.17</version> 
</dependency> 

En primer lugar tenemos que escribir un envoltorio para permitir Cliente Apache HTTP a utilizar JCIF de apoyo NTLMv2:

public final class JCIFSEngine implements NTLMEngine { 

    private static final int TYPE_1_FLAGS = 
      NtlmFlags.NTLMSSP_NEGOTIATE_56 
      | NtlmFlags.NTLMSSP_NEGOTIATE_128 
      | NtlmFlags.NTLMSSP_NEGOTIATE_NTLM2 
      | NtlmFlags.NTLMSSP_NEGOTIATE_ALWAYS_SIGN 
      | NtlmFlags.NTLMSSP_REQUEST_TARGET; 

    @Override 
    public String generateType1Msg(final String domain, final String workstation) 
      throws NTLMEngineException { 
     final Type1Message type1Message = new Type1Message(TYPE_1_FLAGS, domain, workstation); 
     return Base64.encode(type1Message.toByteArray()); 
    } 

    @Override 
    public String generateType3Msg(final String username, final String password, 
      final String domain, final String workstation, final String challenge) 
      throws NTLMEngineException { 
     Type2Message type2Message; 
     try { 
      type2Message = new Type2Message(Base64.decode(challenge)); 
     } catch (final IOException exception) { 
      throw new NTLMEngineException("Invalid NTLM type 2 message", exception); 
     } 
     final int type2Flags = type2Message.getFlags(); 
     final int type3Flags = type2Flags 
       & (0xffffffff^(NtlmFlags.NTLMSSP_TARGET_TYPE_DOMAIN | NtlmFlags.NTLMSSP_TARGET_TYPE_SERVER)); 
     final Type3Message type3Message = new Type3Message(type2Message, password, domain, 
       username, workstation, type3Flags); 
     return Base64.encode(type3Message.toByteArray()); 
    } 
} 

Reference

El código principal para ejecutar PUT HTTP con autenticación:

try { 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     DefaultHttpClient httpclient = new DefaultHttpClient(params); 

     //Register JCIF NTLMv2 to manage ntlm auth. 
     httpclient.getAuthSchemes().register("ntlm", new AuthSchemeFactory() { 
      @Override 
      public AuthScheme newInstance(HttpParams hp) { 
       return new NTLMScheme(new JCIFSEngine()); 
      } 
     }); 

     //Provide login/password 
     httpclient.getCredentialsProvider().setCredentials(
       AuthScope.ANY, 
       new NTCredentials([LOGIN], [PASSWORD], "", [DOMAIN])); 
     //Create HTTP PUT Request  
     HttpPut request = new HttpPut("http://[server]/[site]/[folder]/[fileName]"); 
     request.setEntity(new FileEntity([File]));    

     return httpclient.execute(request); 

    } catch (IOException ex) { 
     //... 
    } 
+0

Hola, tengo problemas para conectarme al SP2013. Me refiero a esta https://code.google.com/p/java-sharepoint-library/. ¿Podrías ayudarme? – tejas

+0

¿Sería posible usar esta solución con HTTP PUT y sobrescribir = verdadero? – dajoropo

1

Creo que mi enfoque podría ayudarlo.

Inicialmente he creado una cuenta sharepoint y seguí el procedimiento en este enlace (http://www.ktskumar.com/2017/01/access-sharepoint-online-using-postman/) para obtener las credenciales necesarias para API REST. Una vez me dieron las credenciales de todo lo que necesitaba era la siguiente dependencia y código:

<dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.5</version> 
</dependency> 

desde que utiliza la autenticación OAuth2, el código para obtener el token de acceso ayuda para otras operaciones CRUD.

/* OAuth2 authentication to get access token */ 
public String getSharePointAccessToken() throws ClientProtocolException, IOException 
{ 
    /* Initializing variables */ 
    String grant_type = RcConstants.GRANT_TYPE; 
    String client_id = RcConstants.CLIENT_ID; 
    String client_secret = RcConstants.CLIENT_SECRET; 
    String resource = RcConstants.RESOURCE; 
    String url = RcConstants.OAUTH_URL + RcConstants.URL_PARAMETER + "/tokens/OAuth/2"; 

    /* 
    * NOTE: RcConstants.OAUTH_URL = 
    * https://accounts.accesscontrol.windows.net/ RcConstants.URL_PARAMETER 
    * = Bearer Realm from 
    * (http://www.ktskumar.com/2017/01/access-sharepoint-online-using- 
    * postman/) Figure 6. 
    */ 

    /* Building URL */ 
    HttpClient client = HttpClientBuilder.create().build(); 
    HttpPost post = new HttpPost(url); 
    post.setHeader("Content-Type", "application/x-www-form-urlencoded"); 

    /* Adding URL Parameters */ 
    List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); 
    urlParameters.add(new BasicNameValuePair("grant_type", grant_type)); 
    urlParameters.add(new BasicNameValuePair("client_id", client_id)); 
    urlParameters.add(new BasicNameValuePair("client_secret", client_secret)); 
    urlParameters.add(new BasicNameValuePair("resource", resource)); 
    post.setEntity(new UrlEncodedFormEntity(urlParameters)); 

    /* Executing the post request */ 
    HttpResponse response = client.execute(post); 
    logger.debug("Response Code : " + response.getStatusLine().getStatusCode()); 

    String json_string = EntityUtils.toString(response.getEntity()); 
    JSONObject temp1 = new JSONObject(json_string); 
    if (temp1 != null) 
    { 
     /* Returning access token */ 
     return temp1.get("access_token").toString(); 
    } 
    return RcConstants.OAUTH_FAIL_MESSAGE; 
} 

Una vez que tengamos el token de acceso se puede cargar utilizando el método siguiente:

public String putRecordInSharePoint(File file) throws ClientProtocolException, IOException 
{ 
    /* Token variable declaration */ 
    String token = getSharePointAccessToken(); 
    /* Null or fail check */ 
    if (!token.equalsIgnoreCase(RcConstants.OAUTH_FAIL_MESSAGE)) 
    { 
     /* Upload path and file name declaration */ 
     String Url_parameter = "Add(url='" + file.getName() + "',overwrite=true)"; 
     String url = RcConstants.UPLOAD_FOLDER_URL + Url_parameter; 
     /* 
     * NOTE: RcConstants.UPLOAD_FOLDER_URL = 
     * https://<your_domain>.sharepoint.com/_api/web/ 
     * GetFolderByServerRelativeUrl('/Shared%20Documents/<FolderName>')/ 
     * Files/ 
     */ 

     /* Building URL */ 
     HttpClient client = HttpClientBuilder.create().build(); 
     HttpPost post = new HttpPost(url); 
     post.setHeader("Authorization", "Bearer " + token); 
     post.setHeader("accept", "application/json;odata=verbose"); 
     /* Declaring File Entity */ 
     post.setEntity(new FileEntity(file)); 

     /* Executing the post request */ 
     HttpResponse response = client.execute(post); 
     logger.debug("Response Code : " + response.getStatusLine().getStatusCode()); 

     if (response.getStatusLine().getStatusCode() == HttpStatus.OK.value()|| response.getStatusLine().getStatusCode() == HttpStatus.ACCEPTED.value()) 
     { 
      /* Returning Success Message */ 
      return RcConstants.UPLOAD_SUCCESS_MESSAGE; 
     } 
     else 
     { 
      /* Returning Failure Message */ 
      return RcConstants.UPLOAD_FAIL_MESSAGE; 
     } 
    } 
    return token; 
} 
+0

Gracias @ChrisTravers –

Cuestiones relacionadas