Johnny2012
Johnny2012

Reputation: 1532

How can I create an SFTP connection in Android?

I want to develop a secured FTP Connection to a server and send/retrieve files using Android.

I have researched a lot and found many different ways, so I don't know which tools and libraries I need for this project.

I'm using Windows and Eclipse.

Upvotes: 3

Views: 42377

Answers (3)

murugan mani
murugan mani

Reputation: 485

   Connect SFTP :
                  try {
            JSch ssh = new JSch();
            session = ssh.getSession("hostusername", "host(ip or host name)", 22);
            session.setPassword("password");
            session.setConfig(config);
            session.connect();
            conStatus = session.isConnected();
            Log.e("Session", "is" + conStatus);
            channel = session.openChannel("sftp");
            channel.connect();

            ChannelSftp sftp = (ChannelSftp) channel;
            sftp.get("sshfile.txt", Environment.getExternalStorageDirectory().getPath() + "/sshfile.txt");
            } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.i("Session", "is" + e);
        } catch (SftpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("Session", "is" + e);
        } /*catch (IOException e) {
            e.printStackTrace();
        }*/

Upvotes: 1

Bezawada Prathap
Bezawada Prathap

Reputation: 21

public class SFTPClient {

Context context;
private static String host = ServerUrl.FTP_HOST;
private static String username = ServerUrl.FTP_USERNAME;
private static String remoteDirectory = "/home/ubuntu/";
public static File photo_file;

/**
 * http://kodehelp.com/java-program-for-uploading-file-to-sftp-server/
 * 
 * @param server
 * @param userName
 * @param openSSHPrivateKey
 * @param remoteDir
 * @param localDir
 * @param localFileName
 * @throws IOException
 */
public static void sftpUploadFile_keyAuthentication_jsch(final Context con,
        final File f) throws IOException {
    photo_file = f;

    new AsyncTask<Void, Void, Void>() {
        private File createFileFromInputStream(InputStream inputStream,
                String fileName) {
            File keyFile = null;
            try {
                keyFile = new File(con.getCacheDir() + "/" + fileName);
                if (!keyFile.exists() || !keyFile.canRead()) {
                    OutputStream outputStream = new FileOutputStream(
                            keyFile);
                    byte buffer[] = new byte[1024];
                    int length = 0;

                    while ((length = inputStream.read(buffer)) > 0) {
                        outputStream.write(buffer, 0, length);
                    }

                    outputStream.close();
                    inputStream.close();
                }
            } catch (IOException e) {
                // Logging exception
                Log.e("error", e + "");

            }

            return keyFile;
        }

        @Override
        protected Void doInBackground(Void... params) {
            FileInputStream fis = null;
            OutputStream os = null;
            try {
                JSch jsch = new JSch();

                AssetManager am = con.getAssets();
                InputStream inputStream = am.open("splash_openssh.ppk");
                File file = createFileFromInputStream(inputStream,
                        "splash_openssh.ppk");

                if (file.exists()) {
                    System.out.println(file + "");
                } else {
                    System.out.println(file + "");
                }

                String path = file + "";
                jsch.addIdentity(path);

                Session session = jsch.getSession(username, host, 22);
                java.util.Properties config = new java.util.Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);
                session.connect();
                System.out.println("JSch JSch Session connected.");
                System.out.println("Opening Channel.");
                System.gc();
                ChannelSftp channelSftp = null;
                channelSftp = (ChannelSftp) session.openChannel("sftp");
                channelSftp.connect();
                channelSftp.cd(remoteDirectory);

                long currentFilelength = f.length();
                fis = new FileInputStream(f);
                channelSftp.put(fis, f.getName());


                Log.w("Start Upload Process", "Start Upload Process");

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
            } catch (JSchException e) {
                e.printStackTrace();
            } catch (SftpException e) {
                e.printStackTrace();
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if (os != null) {
                    try {
                        os.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            return null;
        };
    }.execute();

}

/**
 * 
 * http://kodehelp.com/java-program-for-downloading-file-from-sftp-server/
 * 
 * @param server
 * @param userName
 * @param openSSHPrivateKey
 * @param remoteDir
 * @param remoteFile
 * @param localDir
 * @throws IOException
 */
public static File sftpDownloadFile_keyAuthentication_jsch(final Context con)
        throws IOException {

    new AsyncTask<Void, Void, Void>() {

        private File createFileFromInputStream(InputStream inputStream,
                String fileName) {
            File keyFile = null;
            try {
                keyFile = new File(con.getCacheDir() + "/" + fileName);
                if (!keyFile.exists() || !keyFile.canRead()) {
                    OutputStream outputStream = new FileOutputStream(
                            keyFile);
                    byte buffer[] = new byte[1024];
                    int length = 0;

                    while ((length = inputStream.read(buffer)) > 0) {
                        outputStream.write(buffer, 0, length);
                    }

                    outputStream.close();
                    inputStream.close();
                }
            } catch (IOException e) {
                // Logging exception
                Log.e("error", e + "");

            }

            return keyFile;
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            File newFile = null;
            try {
                // JSch jsch = new JSch();
                // String password =
                // "/storage/sdcard0/Splash/splash_openssh.ppk";
                // System.out.println(password);
                // jsch.addIdentity(password);
                JSch jsch = new JSch();

                AssetManager am = con.getAssets();
                InputStream inputStream;

                inputStream = am.open("splash_openssh.ppk");

                File file = createFileFromInputStream(inputStream,
                        "splash_openssh.ppk");

                if (file.exists()) {
                    System.out.println(file + "");
                } else {
                    System.out.println(file + "");
                }

                String path = file + "";
                jsch.addIdentity(path);
                Session session = jsch.getSession(username, host, 22);
                java.util.Properties config = new java.util.Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);
                session.connect();
                Channel channel = session.openChannel("sftp");
                channel.setOutputStream(System.out);
                channel.connect();
                ChannelSftp channelSftp = (ChannelSftp) channel;
                channelSftp.cd(remoteDirectory);

                byte[] buffer = new byte[1024];
                File mf = Environment.getExternalStorageDirectory();

                BufferedInputStream bis = new BufferedInputStream(
                        channelSftp.get("269-twitter.jpg"));
                newFile = new File(
                        Environment.getExternalStorageDirectory()
                                + "/Splash/upload/", "splash_img1.jpg");

                OutputStream os = null;

                os = new FileOutputStream(newFile);
                BufferedOutputStream bos = new BufferedOutputStream(os);
                int readCount;
                while ((readCount = bis.read(buffer)) > 0) {
                    System.out.println("Writing: ");
                    bos.write(buffer, 0, readCount);
                }
                bos.close();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
            } catch (JSchException e) {
                e.printStackTrace();
            } catch (SftpException e) {
                e.printStackTrace();
            }
            return null;
        };
    }.execute();
    return null;

}

private static String FileSaveInLocalSDCard(File file) {
    // TODO Auto-generated method stub
    String imagePath = "";
    File mf = Environment.getExternalStorageDirectory();
    String storePath = mf.getAbsoluteFile() + "/Splash/upload/";

    File dirFile = new File(storePath);
    dirFile.mkdirs();
    File destfile = new File(dirFile, file.getName());
    imagePath = storePath + file.getName();
    try {
        boolean copyFileValue = copyFile(file, destfile);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    return imagePath;
}

public static Boolean copyFile(File sourceFile, File destFile)
        throws IOException {
    if (!destFile.exists()) {
        destFile.createNewFile();

        FileChannel source = null;
        FileChannel destination = null;
        try {
            source = new FileInputStream(sourceFile).getChannel();
            destination = new FileOutputStream(destFile).getChannel();
            destination.transferFrom(source, 0, source.size());
        } finally {
            if (source != null)
                source.close();
            if (destination != null)
                destination.close();
        }
        return true;
    }
    return false;
}
}

Upvotes: 2

Rory Alsop
Rory Alsop

Reputation: 1439

You can just run an SFTP server and use an SFTP client on your Android device; FileZilla, OpenSSH, Cerberus, etc. - there are millions of SFTP servers.

Install it, and set up authentication (username and password, certificate, whatever you prefer). Ensure SFTP port is open inbound - all these packages let you define the port you wish to use.

For Android, just install an SFTP client like Lysesoft's AndFTP and pop in the address and authentication credentials for your server.

Or if you are actually wanting to do something useful with the files, Android has FTP libraries built in - see the DroidFtp project.

Upvotes: 6

Related Questions