Как загрузить документ в SharePoint с помощью Java?

Я создаю несколько больших файлов (экспорт DB) с Java, и мне нужно разместить их где-нибудь на нашем сервере SharePoint. Прямо сейчас, я делаю это с IE, но я тоже хотел бы автоматизировать этот шаг.

Я искал в Интернете, и я нашел несколько советов по использованию SOAP, но на самом деле я не вижу в этом ничего общего. Может ли кто-нибудь предоставить мне образец кода или рецепт, что мне нужно сделать?

Обратите внимание: сервер SharePoint запрашивает аутентификацию домена NT. Я даже не могу войти в Firefox: (

ИЗМЕНИТЬ

  • Как преобразовать страшный URL в IE в путь WebDAV?
  • Есть ли "проводник" WebDAV, который я могу использовать, прежде чем я разрушу систему производства с помощью моего кода? Я попробовал "DAV Explorer 0.91" из http://www.davexplorer.org/, но не может подключиться (возможно, из-за NT-домена auth).
5 ответов

Хорошо... после нескольких часов работы и кусания себя через "документацию" MicroSoft предоставляет и все подсказки, случайно распределенные по сети, мне удалось написать примерный код для просмотра содержимого сервера SharePoint: Перемещение папок SharePoint с помощью Axis2.

Следующая остановка: добавление чего-то.


В дополнение к предложениям Sacha вы можете использовать веб-службы SharePoint SOAP. Каждый сайт SharePoint предоставляет кучу веб-сервисов по пути http://<site>/_vti_bin/</site>.

В вашем случае вы, вероятно, захотите Список веб-службы (http://<site>/_vti_bin/Lists.asmx</site>). Вы можете захватить WSDL с http://<site>/_vti_bin/Lists.asmx?WSDL</site>. WSS 3.0 SDK содержит подробную информацию о том, как использовать веб-службу (вы, вероятно, захотите использовать методы UpdateListItems и AddAttachment).

Все, что сказал, первый вариант Sacha (сопоставление библиотеки документов с диском), вероятно, самый простой способ предположить, что вы можете обойти проблемы NTLM.

Если вы используете Windows, вы можете просто перейти к пути UNC для библиотеки документов. Например, если URL-адрес браузера для вашей библиотеки документов:

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

вы можете просто ввести соответствующий UNC-путь в адресной строке проводника Windows:

\\<site>\Foo\BarDocs</site>

а затем перетащите файлы в это место. Если вы хотите, чтобы вы могли сопоставить это местоположение с буквой диска с помощью проводника Windows или утилиты командной строки SUBST.EXE.


Другим решением является использование метода HTTP PUT для отправки файла непосредственно в Sharepoint.

Для этого вы можете использовать Apache HTTP Client:

<dependency>
 <groupid>org.apache.httpcomponents</groupid>
 <artifactid>httpclient</artifactid>
 <version>4.2.3</version>
</dependency>

И чтобы разрешить NTLMv2-аутентификацию вам нужна библиотека JCIF.

<dependency>
 <groupid>jcifs</groupid>
 <artifactid>jcifs</artifactid>
 <version>1.3.17</version>
</dependency>

Сначала нам нужно написать оболочку, чтобы Apache HTTP Client мог использовать JCIF для поддержки 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());
 }
}

Ссылка

Основной код для выполнения HTTP PUT с аутентификацией:

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) {
 //...
 }


Я могу думать о разных вариантах:

  • Сопоставление библиотеки документов с файловым диском и просто сохранение файла, как и любой другой файл в файловой системе.
  • Использование протокола HTTP WebDAV.

... и для части проверки подлинности NTLM:

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


Я думаю, мой подход может помочь вам.

Сначала я создал учетную запись sharepoint и выполнил процедуру в этой ссылке (http://www.ktskumar.com/2017/01/access-sharepoint-online-using-postman/), чтобы получить необходимые учетные данные для REST API. как только я получил учетные данные, все, что мне нужно, это следующая зависимость и код:

<dependency>
 <groupid>org.apache.httpcomponents</groupid>
 <artifactid>httpclient</artifactid>
 <version>4.5</version>
</dependency>

Поскольку я использовал аутентификацию OAUTH2, код для доступа к токену помогает для других операций 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<*************> urlParameters = new ArrayList<*************>();
 urlParameters.add(new ******************("grant_type", grant_type));
 urlParameters.add(new ******************("client_id", client_id));
 urlParameters.add(new ******************("client_secret", client_secret));
 urlParameters.add(new ******************("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;
}
</*************></*************>

Как только мы получим токен доступа, мы можем загрузить с помощью следующего метода:

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;
}
</foldername></your_domain>

licensed under cc by-sa 3.0 with attribution.