How do I upload a document to SharePoint with Java?

前端 未结 6 2033
余生分开走
余生分开走 2020-12-30 03:47

I\'m creating some big files (DB exports) with Java and I need to put them somewhere on our SharePoint server. Right now, I\'m doing this with IE but I\'d like to automate t

6条回答
  •  佛祖请我去吃肉
    2020-12-30 03:55

    An other solution is to use HTTP PUT method to send a file directly to the Sharepoint.

    For that you can use Apache HTTP Client:

    
        org.apache.httpcomponents
        httpclient
        4.2.3
    
    

    And to permit NTLMv2 authentication you need JCIF library.

    
       jcifs
       jcifs
       1.3.17
    
    

    First we need to write a wrapper to permit Apache HTTP Client to use JCIF for NTLMv2 support :

    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

    The main code to execute HTTP PUT with authentication:

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

提交回复
热议问题