2008-11-24 7 views
13

Tôi đang tạo một số tệp lớn (xuất DB) bằng Java và tôi cần đặt chúng ở đâu đó trên máy chủ SharePoint của chúng tôi. Ngay bây giờ, tôi đang làm điều này với IE nhưng tôi cũng muốn tự động hóa bước này.Làm cách nào để tải tài liệu lên SharePoint bằng Java?

Tôi đã tìm kiếm trên web và tôi đã tìm thấy một số gợi ý để sử dụng SOAP nhưng tôi chưa thực sự nhìn thấy nền tảng của tất cả điều này. Ai đó có thể cung cấp cho tôi một số mã mẫu hoặc công thức mà tôi cần làm không?

Xin lưu ý: máy chủ SharePoint yêu cầu xác thực miền NT. Tôi thậm chí không thể đăng nhập với Firefox :(

EDIT

  • Làm thế nào để chuyển đổi URL đáng sợ trong IE vào một con đường WebDAV?
  • Có WebDAV "thám hiểm" mà tôi có thể ? sử dụng trước khi tôi làm hỏng hệ thống sản xuất với mã của tôi, tôi đã cố gắng "DAV Explorer 0,91" từ http://www.davexplorer.org/ nhưng điều đó không thể kết nối (có lẽ vì NT auth miền)

Trả lời

3

OK ...sau vài giờ làm việc và tự cắn mình thông qua "tài liệu" MicroSoft cung cấp và tất cả các gợi ý ngẫu nhiên trải rộng trên 'net, tôi đã quản lý để viết một số mã mẫu để duyệt nội dung của máy chủ SharePoint: Navigating SharePoint Folders With Axis2.

Điểm dừng tiếp theo: Tải lên nội dung nào đó.

1

tôi có thể nghĩ đến tùy chọn khác nhau:.

  • Ánh xạ thư viện tài liệu vào ổ đĩa và chỉ lưu tệp như bất kỳ tệp nào khác vào hệ thống tệp.
  • Sử dụng giao thức HTTP WebDAV.

... và cho phần xác thực NTLM:

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

7

Ngoài Sacha's suggestions, bạn có thể sử dụng các dịch vụ web SharePoint SOAP. Mỗi trang SharePoint hiển thị một loạt các dịch vụ web thông qua đường dẫn http://<Site>/_vti_bin/.

Trong trường hợp của bạn, bạn có thể muốn Lists web service (http://<Site>/_vti_bin/Lists.asmx). Bạn có thể lấy WSDL từ http://<Site>/_vti_bin/Lists.asmx?WSDL. SDK WSS 3.0 có các chi tiết về cách sử dụng dịch vụ web (có thể bạn sẽ muốn sử dụng các phương thức UpdateListItemsAddAttachment).

Tất cả những gì đã nói, tùy chọn đầu tiên của Sacha (ánh xạ thư viện tài liệu đến một ổ đĩa) có lẽ là cách dễ nhất giả sử bạn có thể gặp phải các vấn đề NTLM.

Nếu bạn đang sử dụng Windows, bạn chỉ cần điều hướng đến đường dẫn UNC cho thư viện tài liệu. Ví dụ, nếu URL trình duyệt cho thư viện tài liệu của bạn là:

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

bạn có thể chỉ cần gõ đường dẫn UNC tương ứng vào thanh địa chỉ của Windows Explorer:

\\<Site>\Foo\BarDocs

và sau đó kéo và thả tệp vào vị trí này. Nếu bạn muốn, bạn có thể ánh xạ vị trí này vào một ký tự ổ đĩa bằng cách sử dụng Windows Explorer hoặc tiện ích dòng lệnh SUBST.EXE.

+1

UNC không hoạt động; từ khi nào có sẵn? Tôi đang sử dụng XP và tôi không biết phiên bản SP nào đang được sử dụng. –

+0

Tải xuống WSDL hoạt động nhưng không có thông tin phiên bản:/ –

+0

Tôi nhận thấy rằng điều này là đáng kể sau đó, nhưng đường dẫn UNC đã làm việc cho tôi. Tôi đã có thể sử dụng đường dẫn đó với API IO của Java để ghi tài liệu trực tiếp vào Sharepoint. +1 – RustyTheBoyRobot

3

Một giải pháp khác là sử dụng phương thức HTTP PUT HTTP PUT để gửi tệp trực tiếp đến Sharepoint.

Cho rằng bạn có thể sử dụng Apache HTTP khách hàng:

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

Và để cho phép xác thực NTLMv2 bạn cần JCIF thư viện.

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

tiên chúng ta cần phải viết một wrapper cho phép Apache HTTP Client để sử dụng JCIF hỗ trợ 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

Mã chính để thực hiện HTTP PUT với xác thực:

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

Xin chào, tôi đang gặp sự cố khi kết nối với SP2013. Tôi đang giới thiệu https://code.google.com/p/java-sharepoint-library/ này. Bạn có thể giúp tôi không? – tejas

+0

Có thể sử dụng giải pháp này với HTTP PUT và ghi đè = true không? – dajoropo

1

Tôi nghĩ rằng cách tiếp cận của tôi có thể giúp bạn.

Ban đầu tôi đã tạo tài khoản sharepoint và làm theo quy trình trong liên kết này (http://www.ktskumar.com/2017/01/access-sharepoint-online-using-postman/) để nhận thông tin xác thực cần thiết cho REST API. một khi tôi nhận được thông tin đăng nhập, tất cả những gì tôi cần là phụ thuộc và mã sau đây:

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

Vì tôi đã sử dụng xác thực OAUTH2, mã để nhận mã thông báo truy cập giúp các hoạt động CRUD khác.

/* 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; 
} 

Một khi chúng ta nhận mã thông báo truy cập chúng tôi có thể tải lên sử dụng phương pháp sau đây:

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

Cảm ơn bạn @ChrisTravers –