Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apache VFS2 - can't upload file to SFTP server

I'm trying to use Apache VFS2 to upload files to SFTP server. SFTP works OK when using client like WinSCP. I took some examples found in the internet to use the java client, but I'm keep getting errors. The version used is 2.3. The code:

public class SftpPersister
{
    private static final Logger logger          = Logger.getLogger( SftpPersister.class );

    String                      serverAddress   = "ftp.domain.com";
    String                      user            = "myuser";
    String                      password        = "mypass";
    String                      remoteDirectory = "outgoing/";
    String                      localDirectory  = "c:/users/user/";

   public static void main( String[] args )
   {
      new SftpPersister().upload( "ntuser.ini" );
   }

   public boolean upload( String fileName )
   {
      StandardFileSystemManager manager = new StandardFileSystemManager();

      try
      {

        //check if the file exists
        String filepath = localDirectory + fileName;
        File file = new File( filepath );
        if( !file.exists() )
            throw new RuntimeException( "Error. Local file not found" );

        //Initializes the file manager
        manager.init();

        //Setup our SFTP configuration
        FileSystemOptions opts = new FileSystemOptions();
        SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking( opts, "no" );
        SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot( opts, true );
        SftpFileSystemConfigBuilder.getInstance().setTimeout( opts, 10000 );

        //Create the SFTP URI using the host name, userid, password,  remote path and file name
        String sftpUri = "sftp:///" + user + ":" + password + "@" + serverAddress + "/" + remoteDirectory + fileName;

        // Create local file object
        FileObject localFile = manager.resolveFile( file.getAbsolutePath() );

        // Create remote file object
        FileObject remoteFile = manager.resolveFile( sftpUri, opts );

        // Copy local file to sftp server
        remoteFile.copyFrom( localFile, Selectors.SELECT_SELF );

        logger.info( "File upload successful" );

    }
    catch ( Exception e )
    {
        logger.error( "failure", e );

        return false;
    }
    finally
    {
        manager.close();
    }

    return true;
}

}

Exception is thrown when executing the line remoteFile.copyFrom( localFile, Selectors.SELECT_SELF ) :

1 [main] ERROR com.company.middletier.storage.SftpPersister  - failure
org.apache.commons.vfs2.FileSystemException: Could not find file with URI "sftp:///myuser:***@ftp.domain.com/outgoing/ntuser.ini" because it is a relative path, and no base URI was provided.
at org.apache.commons.vfs2.FileSystemException.requireNonNull(FileSystemException.java:87)
at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:733)
at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:653)
at com.company.middletier.storage.SftpPersister.upload(SftpPersister.java:63)
at com.company.middletier.storage.SftpPersister.main(SftpPersister.java:31)

Is it some configuration issue or something else I'm missing?

like image 398
Seffy Avatar asked May 15 '19 09:05

Seffy


2 Answers

    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>${jsch.version}</version>
    </dependency>

Implicity dependency to jsch helped me with that problem

like image 93
lolcio Avatar answered Nov 19 '22 10:11

lolcio


It seems like jsch is a required runtime dependency that needed to be added to the POM file. Not sure is mentioned in the docs. Once added all works smoothly.

like image 17
Seffy Avatar answered Nov 19 '22 09:11

Seffy