2013-03-15 94 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?