2008-11-24 145 views
13

我正在用Java創建一些大文件(數據庫導出),我需要將它們放在我們的SharePoint服務器上的某個地方。現在,我正在使用IE做這件事,但我也想自動化這一步。如何使用Java將文檔上傳到SharePoint?

我搜索了網頁,我發現了一些使用SOAP的提示,但我並沒有真正看到所有這一切的基礎。有人可以提供一些示例代碼或配方,我需要做什麼?

請注意:SharePoint服務器要求進行NT域身份驗證。我甚至不能用Firefox登錄:(

編輯

  • 如何轉換可怕的網址在IE成WebDAV的路徑?
  • 有一個WebDAV的「探險家」,我可以?之前我毀了生產系統與我的代碼使用我試過「DAV瀏覽器0.91」從http://www.davexplorer.org/但無法連接(可能是因爲NT域身份驗證的)

回答

3

好的...經過幾個小時的工作和咬住自己通過MicroSoft提供的「文檔」,所有提示隨機分佈在「網絡」上,我設法編寫了一些示例代碼來瀏覽SharePoint服務器的內容:Navigating SharePoint Folders With Axis2

下一站:上傳東西。

7

除了Sacha's suggestions,您可以使用SharePoint SOAP的Web服務。每個SharePoint網站通過路徑http://<Site>/_vti_bin/公開一系列Web服務。

就你而言,你可能需要Lists web servicehttp://<Site>/_vti_bin/Lists.asmx)。您可以從http://<Site>/_vti_bin/Lists.asmx?WSDL獲取WSDL。 WSS 3.0 SDK詳細介紹瞭如何使用Web服務(您可能需要使用UpdateListItemsAddAttachment方法)。

所有這些都說,Sacha的第一個選擇(將文檔庫映射到驅動器)可能是最簡單的方法,假設您可以解決NTLM問題。

如果您使用Windows,則可以簡單地導航到文檔庫的UNC路徑。例如,如果你的文檔庫瀏覽器的網址是:

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

你可以簡單地鍵入Windows資源管理器地址欄相應的UNC路徑:

\\<Site>\Foo\BarDocs

,然後拖動和將文件拖放到此位置。如果您希望使用Windows資源管理器或SUBST.EXE命令行實用工具將此位置映射到驅動器號。

+1

UNC不起作用;從什麼時候可用?我在XP上,但我不知道哪個版本的SP正在使用。 – 2008-11-24 16:45:33

+0

WSDL下載工作,但沒有版本信息:/ – 2008-11-24 16:47:24

+0

我意識到這是顯着更晚,但UNC路徑爲我工作。我能夠通過Java的IO API使用該路徑將文檔直接寫入Sharepoint。 +1 – RustyTheBoyRobot 2012-12-05 22:41:24

3

另一種解決方案是使用HTTP PUT方法將文件直接發送到Sharepoint。

對於您可以使用Apache的HTTP客戶端

<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客戶端使用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()); 
    } 
} 

Reference

主要的代碼驗證執行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) { 
     //... 
    } 
1

我想我的方法可能會對您有所幫助。

最初,我創建了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<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; 
} 

一旦我們得到了我們可以上傳使用下面的方法訪問令牌:

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; 
} 
相關問題