2013-03-15 47 views
0

我試圖從Java中的Sharepoint列表中刪除一個文件,並遇到一些問題。我正在使用批量元素here從Java中的SharePoint列表中刪除文件

我能夠提出請求,但返回的結果爲空且文件未被刪除(我沒有收到任何錯誤)。

下面是我使用的UpdateListItems.Update代碼:

UpdateListItems.Updates updates = new UpdateListItems.Updates(); 
    updates.getContent().add(this.generateXmlNode(  
     "<Batch PreCalc='True' OnError='Continue' ListVersion='1' ListName='" + spMoveRequest.getListName() + "'>" + 
      "<Method ID='1' Cmd='Delete'>" + 
      "<Field Name='ID'>5</Field>" +//this must be where we specify the file 
      "</Method>" + 
     "</Batch>" 
    )); 

我再使listSoap對象這樣的一個方法調用:

UpdateListItemsResult updateResult = listSoap.updateListItems("<my list name here>", updates); 

我以前也試過像使用GUID而不是實際的列表名稱,並使用

<Field Name='FileRef'><my file url here></Field> 

到IDENT許多變化ify文件。

似乎沒有任何工作,我也沒有得到任何有用的反饋。

 protected Node generateXmlNode(String sXML) throws ParserConfigurationException, SAXException, IOException { 

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setValidating(false); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document documentOptions = builder.parse(new InputSource(new StringReader(sXML))); 
    Node elementOptions = documentOptions.getDocumentElement(); 
    return elementOptions; 

} 

,但沒有問題檢索SharePoint列表時,我已經在過去使用這樣的:

的generateXmlNode方法,我使用看起來像這樣。

我在這裏錯過了什麼?

+0

看看[這](http://stackoverflow.com/questions/13395038/deleting-a-file-from-sharepoint-using-web-service) 有沒有嘗試過,但可能工作。 – 2013-03-15 21:50:54

+0

Jeff的鏈接可能會有所幫助,您可能想使用[Fiddler](http://www.fiddler2.com/fiddler2/)將該代碼的輸出與您的輸出進行比較。如果你有權訪問服務器日誌,那麼你也應該看看那裏。 – 2013-03-16 14:21:38

回答

1

的其他解決方案是使用HTTP DELETE方法直接刪除文件到SharePoint與NTLMv2身份驗證

對於您可以使用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刪除與認證:

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 HttpDelete("http://[server]/[site]/[folder]/[fileName]");   
     return httpclient.execute(request); 

    } catch (IOException ex) { 
     //... 
    } 

鏈接的問題上傳文件到Sharepoint: How do I upload a document to SharePoint with Java?