SFTP工具类实现文件上传下载_

发布于:2025-05-29 ⋅ 阅读:(46) ⋅ 点赞:(0)
import com.jcraft.jsch.*;
import com.jcraft.jsch.ChannelSftp.LsEntry;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;

/**
 * SFTP工具类
 */
public class SftpFile {

    static Session sshSession = null;

    /**
     * 获取ChannelSftp
     */
    public static ChannelSftp getConnectIP(String host, String sOnlineSftpPort, String username, String password) {
        int port = 0;
        if (!("".equals(sOnlineSftpPort)) && null != sOnlineSftpPort) {
            port = Integer.parseInt(sOnlineSftpPort);
        }
        ChannelSftp sftp = null;
        try {
            JSch jsch = new JSch();
            jsch.getSession(username, host, port);
            sshSession = jsch.getSession(username, host, port);
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sftp;
    }

    /**
     * 上传
     */
    public static void upload(String directory, String uploadFile, ChannelSftp sftp) {
        FileInputStream io = null;
        try {
            sftp.cd(directory);
            File file = new File(uploadFile);
            io = new FileInputStream(file);
            sftp.put(io, file.getName());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != io) {
                try {
                    io.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (sftp.isConnected()) {
                sshSession.disconnect();
                sftp.disconnect();
            }

        }
    }
    //删除指定目录下的所有文件
    static boolean deleteDirFiles(String newsFile, ChannelSftp sftp) {
        try {
            sftp.cd(newsFile);
            ListIterator a = sftp.ls(newsFile).listIterator();
            while (a.hasNext()) {
                LsEntry oj = (LsEntry) a.next();
                SftpFile.delete(newsFile, oj.getFilename(), sftp);
            }
        } catch (Exception e) {
            e.getMessage();
        } finally {
            if (sftp.isConnected()) {
                sshSession.disconnect();
                sftp.disconnect();
            }
        }
        return true;
    }

    /**
     * 上传本地文件到sftp指定的服务器,
     *
     * @param directory      目标文件夹
     * @param uploadFile     本地文件夹
     * @param sftp           sftp地址
     * @param remoteFileName 重命名的文件名字
     * @param isRemote       是否需要重命名  是true 就引用remoteFileName 是false就用默认的文件名字
     */
    public static void upload(String directory, String uploadFile, ChannelSftp sftp, String remoteFileName, boolean isRemote) {
        FileInputStream io = null;
        try {
            boolean isExist = false;
            try {
                SftpATTRS sftpATTRS = sftp.lstat(directory);
                isExist = true;
                isExist = sftpATTRS.isDir();
            } catch (Exception e) {
                if (e.getMessage().toLowerCase().equals("no such file")) {
                    isExist = false;
                }
            }
            if (!isExist) {
                boolean existDir = SftpFile.isExistDir(directory, sftp);
                if (!existDir) {
                    String pathArry[] = directory.split("/");
                    StringBuffer Path = new StringBuffer("/");
                    for (String path : pathArry) {
                        if (path.equals("")) {
                            continue;
                        }
                        Path.append(path + "/");
                        if (!SftpFile.isExistDir(Path + "", sftp)) {
                            // 建立目录
                            sftp.mkdir(Path.toString());
                            // 进入并设置为当前目录
                        }
                        sftp.cd(Path.toString());
                    }
                }
            }
            sftp.cd(directory);
            File file = new File(uploadFile);
            io = new FileInputStream(file);
            if (isRemote) {
                sftp.put(io, remoteFileName);
            } else {
                sftp.put(io, file.getName());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != io) {
                try {
                    io.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (sftp.isConnected()) {
                sshSession.disconnect();
                sftp.disconnect();
            }

        }
    }


    public static boolean isExistDir(String path, ChannelSftp sftp) {
        boolean isExist = false;
        try {
            SftpATTRS sftpATTRS = sftp.lstat(path);
            isExist = true;
            return sftpATTRS.isDir();
        } catch (Exception e) {
            if (e.getMessage().toLowerCase().equals("no such file")) {
                isExist = false;
            }
        }
        return isExist;

    }


    /**
     * 上传目录下的多个文件
     */
    public static List<String> uploadZip(String directory, String uploadFile, ChannelSftp sftp, List<String> filePath) {
        try {
            List<String> list = new ArrayList<>();
            boolean existDir = SftpFile.isExistDir(directory, sftp);
            if (!existDir) {
                sftp.mkdir(directory);
            }
            sftp.cd(directory);
            int i = 1;
            for (String newPath : filePath) {
                FileInputStream io = null;
                try {
                    File file = new File(uploadFile + newPath);
                    io = new FileInputStream(file);
                    sftp.put(io, newPath);
                    io.close();
                    list.add(newPath);
                    i++;
                } catch (Exception ex) {
                    ex.printStackTrace();
                } finally {
                    if (null != io) {
                        try {
                            io.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            return list;
        } catch (SftpException e) {
            e.getMessage();
            return null;
        } finally {
            if (sftp.isConnected()) {
                sshSession.disconnect();
                sftp.disconnect();
            }
        }
    }

    /**
     * 下载指定文件
     */
    public static void download(String directory, String downloadFile, String saveFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            File file = new File(saveFile);
            sftp.get(downloadFile, new FileOutputStream(file));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sftp.isConnected()) {
                sshSession.disconnect();
                sftp.disconnect();
            }
        }
        System.out.println("DOWNLOAD SUCCESS!");
    }

    /**
     * 查看指定目录下的所有文件
     */
    public static List<String> check(String directory, ChannelSftp sftp) {
        List<String> fileList = new ArrayList<>();
        try {
            sftp.cd(directory);
            ListIterator a = sftp.ls(directory).listIterator();
            while (a.hasNext()) {
                LsEntry oj = (LsEntry) a.next();
                System.out.println(oj.getFilename());
                //fileList.add((String) a.next());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sftp.isConnected()) {
                sshSession.disconnect();
                sftp.disconnect();
            }

        }
        return fileList;
    }

    /**
     * 删除指定路径下的指定文件
     */
    public static void delete(String directory, String deleteFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            sftp.rm(deleteFile);
            System.out.println("文件:"+deleteFile+" 删除成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (sftp.isConnected()) {
                sshSession.disconnect();
                sftp.disconnect();
            }

        }


    }


    public static void main(String[] args) {
        //服务器地址,端口,用户名,密码
        ChannelSftp ftp = getConnectIP("10.0.0.131", "22", "root", "123456");
        //上传单个文件
//        upload("/mydata/", "C:\\Users\\Administrator\\Desktop\\1.txt", ftp);
//        upload("/mydata/", "C:\\Users\\Administrator\\Desktop\\picture.zip", ftp);

        //上传文件并重命名
//        upload("/mydata/", "C:\\Users\\Administrator\\Desktop\\1.txt", ftp,"2.txt",true);

        //删除指定文件
//        delete("/mydata","1.txt",ftp);

        //查看指定目录下的所有文件
//        check("/mydata",ftp);

        //从服务器下载文件
//        download("/mydata","2.txt","C:\\Users\\Administrator\\Desktop\\2.txt",ftp);

        //同时上传多个文件
//        uploadZip("/mydata/picture", "C:\\Users\\Administrator\\Desktop\\picture\\", ftp, Arrays.asList("1.png","2.png"));

        //删除指定目录下的所有文件
        deleteDirFiles("/mydata/picture",ftp);
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到