Solución:
Además de las sugerencias de Sacha, puede utilizar los servicios web SOAP de SharePoint. Cada sitio de SharePoint expone un montón de servicios web a través de la ruta http://<Site>/_vti_bin/
.
En su caso, probablemente desee el servicio web Lists (http://<Site>/_vti_bin/Lists.asmx
). Puede obtener el WSDL de http://<Site>/_vti_bin/Lists.asmx?WSDL
. El SDK de WSS 3.0 tiene detalles sobre cómo usar el servicio web (probablemente querrá usar el UpdateListItems
y AddAttachment
métodos).
Dicho todo esto, la primera opción de Sacha (mapear una biblioteca de documentos a una unidad) es probablemente la forma más fácil asumiendo que puede evitar los problemas de NTLM.
Si está utilizando Windows, simplemente puede navegar a una ruta UNC para una biblioteca de documentos. Por ejemplo, si la URL del navegador de su biblioteca de documentos es:
http://<Site>/Foo/BarDocs/Forms/AllItems.aspx
simplemente puede escribir la ruta UNC correspondiente en la barra de direcciones del Explorador de Windows:
\<Site>FooBarDocs
y luego arrastre y suelte los archivos en esta ubicación. Si lo desea, puede asignar esta ubicación a una letra de unidad utilizando el Explorador de Windows o la utilidad de línea de comandos SUBST.EXE.
De acuerdo … después de varias horas de trabajo y mordiéndome a través de la “documentación” que proporciona MicroSoft y todas las sugerencias distribuidas aleatoriamente en la red, logré escribir un código de muestra para explorar el contenido de un servidor de SharePoint: Navegando por SharePoint Carpetas con Axis2.
Siguiente parada: subiendo algo.
Otra solución es usar Método HTTP PUT para enviar un archivo directamente al Sharepoint.
Para eso puedes usar Cliente HTTP Apache:
<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>
Primero necesitamos escribir un contenedor para permitir que Apache HTTP Client use JCIF para soporte 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());
}
}
Referencia
El código principal para ejecutar HTTP PUT 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) {
//...
}