Upload file to Microsoft Office Sharepoint Server 2007
Microsoft Office Sharepoint Server 2007 (aka MOSS2007) provides a web services catalog in order to perform a large collection of operations on it. Morever, if enabled, WebDAV access is available.
The obvious way to upload a file to MOSS Shared Documents is the use of WebDAV protocol, however Microsoft includes a web service to perform this operation additionally. Below, both methods are shown.
Using WebDAV protocol
Required libraries: commons-httpclient-3.1.jar, commons-codec-1.3.jar, commons-logging-1.1.1.jar, log4j-1.2.15.jar, slf4j-api-1.5.6.jar, slf4j-log4j12-1.5.6.jar, jackrabbit-webdav-1.4.jar
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NTCredentials;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.jackrabbit.webdav.client.methods.PutMethod;
public class UploadFileMOSSWebDAV {
// Proxy parameters
static String proxyHost = "proxy.server.com";
static Integer proxyPort = 80;
static String proxyUser = "user";
static String proxyPass = "pass";
// Sharepoint parameters
static String sharepointUser = "user";
static String sharepointPass = "pass";
static String sharepointDomain = "DOMAIN";
// Shared Documents folder root
static String sharedDocumentsRoot = "http://sharepoint.server.com/sites/IdSite/Shared Documents/";
/**
* Note: Setting credentials with AuthScope.ANY authentication scope (null value for host and/or realm) is
* highly discouraged in production applications.
* @param args
* @throws Exception
*/
public static void main(String... args) throws Exception {
// HTTP client with authentication enabled
HttpClient client = new HttpClient();
client.getParams().setAuthenticationPreemptive(true);
// Proxy configuration
client.getHostConfiguration().setProxy(proxyHost, proxyPort);
client.getState().setProxyCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(proxyUser, proxyPass));
// Sharepoint authentication
Credentials defaultcreds =
new NTCredentials(sharepointUser, sharepointPass, "localhost", sharepointDomain);
client.getState().setCredentials(AuthScope.ANY, defaultcreds);
// Upload local file test.txt to sharedDocumentsRoot/SomeFolder/test.txt
PutMethod method = new PutMethod(sharedDocumentsRoot + "SomeFolder/test.txt");
RequestEntity requestEntity =
new InputStreamRequestEntity(new FileInputStream(new File("c:/temp/test.txt")));
method.setRequestEntity(requestEntity);
client.executeMethod(method);
System.out.println(method.getStatusCode() + " "+ method.getStatusText());
}
}
Using MOSS Copy web service
Required libraries: commons-httpclient-3.1.jar, commons-codec-1.3.jar, commons-logging-1.1.1.jar, log4j-1.2.15.jar, activation-1.1.1.jar, saaj-api-1.3.jar, saaj-impl-1.3.2.jar, spring-core-2.5.6.jar, spring-context-2.5.6.jar, spring-beans-2.5.6.jar, spring-oxm-1.5.6.jar, spring-ws-core-1.5.6.jar, spring-xml-1.5.6.jar, xmlbeans tool
Resources: Getting started with Sharepoint Web Services
1. Retrieve WSDL from Sharepoint
WSDL for Copy web service can be found at http://sharepoint.server.com/sites/IdSite/_vti_bin/Copy.asmx?WSDL
2. Extract XSD from WSDL
Extract “s:schema” node from WSDL and include namespaces on root element
< ?xml version="1.0" encoding="utf-8"?>
<s_schema xmlns_s="http://www.w3.org/2001/XMLSchema"
xmlns_tns="http://schemas.microsoft.com/sharepoint/soap/"
elementFormDefault="qualified"
targetNamespace="http://schemas.microsoft.com/sharepoint/soap/">
[...]
</s_schema>
Note. “:” replaced by “_” for visualization.
3. Generate XMLBeans objects for marshal
Use XMLBeans Ant Task to generate Java objects in order to perform marshalling and unmarshalling operations from XML
4. Web service client
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NTCredentials;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.impl.util.Base64;
import org.springframework.oxm.xmlbeans.XmlBeansMarshaller;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import org.springframework.ws.soap.client.core.SoapActionCallback;
import org.springframework.ws.transport.http.CommonsHttpMessageSender;
import com.microsoft.schemas.sharepoint.soap.CopyIntoItemsDocument;
import com.microsoft.schemas.sharepoint.soap.DestinationUrlCollection;
import com.microsoft.schemas.sharepoint.soap.CopyIntoItemsDocument.CopyIntoItems;
public class UploadFileMOSSWS extends WebServiceGatewaySupport {
// Proxy parameters
static String proxyHost = "proxy.server.com";
static Integer proxyPort = 80;
static String proxyUser = "user";
static String proxyPass = "pass";
// Sharepoint parameters
static String sharepointUser = "user";
static String sharepointPass = "pass";
static String sharepointDomain = "DOMAIN";
// Shared Documents folder root
static String sharedDocumentsRoot = "http://sharepoint.server.com/sites/IdSite/Shared Documents/";
// WS Uri
static String defaultWSUri = "http://sharepoint.server.com/sites/IdSite/_vti_bin/Copy.asmx";
/**
* Note: Setting credentials with AuthScope.ANY authentication scope (null value for host and/or realm) is
* highly discouraged in production applications.
* @param args
* @throws Exception
*/
public static void main(String... args) throws Exception {
// XMLBeans request object
CopyIntoItemsDocument request = CopyIntoItemsDocument.Factory.newInstance();
CopyIntoItems cii = request.addNewCopyIntoItems();
DestinationUrlCollection duc = DestinationUrlCollection.Factory.newInstance();
duc.addNewString().setStringValue(sharedDocumentsRoot + "SomeFolder/test.txt");
cii.setDestinationUrls(duc);
cii.addNewFields().addNewFieldInformation();
// Sample file
String fileContent = "";
FileInputStream fis = new FileInputStream(new File("c:/temp/test.txt"));
while (fis.available() > 0) {
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fileContent = fileContent + new String(buffer);
}
cii.setStream(Base64.encode(fileContent.getBytes()));
// MOSS WS Copy File invocation with SOAP Action CopyIntoItems
System.out.println(new UploadFileMOSSWS().
callWs(request, "http://schemas.microsoft.com/sharepoint/soap/CopyIntoItems"));
}
/**
* Generic Spring WS Client
* @param input
* @param soapAction
* @return
*/
private XmlObject callWs(XmlObject input, String soapAction) {
XmlObject result = null;
// WS Client
WebServiceTemplate wst = getWebServiceTemplate();
XmlBeansMarshaller marshaller = new XmlBeansMarshaller();
wst.setMarshaller(marshaller);
wst.setUnmarshaller(marshaller);
wst.setDefaultUri(defaultWSUri);
// HTTP Client configuration
HttpClient client = new HttpClient();
client.getParams().setAuthenticationPreemptive(true);
client.getHostConfiguration().setProxy(proxyHost, proxyPort);
client.getState().setProxyCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(proxyUser, proxyPass));
Credentials defaultcreds =
new NTCredentials(sharepointUser, sharepointPass, "localhost", sharepointDomain);
client.getState().setCredentials(AuthScope.ANY, defaultcreds);
CommonsHttpMessageSender messageSender = new CommonsHttpMessageSender(client);
wst.setMessageSender(messageSender);
// WS invocation with SOAP Action
result = (XmlObject)wst.marshalSendAndReceive(input, new SoapActionCallback(soapAction));
return result;
}
}