java 实现FTP sftp

本文介绍了一种基于Java的FTP和SFTP文件传输工具类的实现方式,包括文件的上传、下载、删除等基本操作,并提供了测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package utils.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class FavFTPUtil {

    /**
     * 上传文件(可供Action/Controller层使用)
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器保存目录
     * @param fileName
     *            上传到FTP服务器后的文件名称
     * @param inputStream
     *            输入文件流
     * @return
     */
    public static boolean uploadFile(String hostname, int port,
            String username, String password, String pathname, String fileName,
            InputStream inputStream) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding("UTF-8");
        try {
            // 连接FTP服务器
            ftpClient.connect(hostname, port);
            // 登录FTP服务器
            ftpClient.login(username, password);
            // 是否成功登录FTP服务器
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                return flag;
            }

            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.makeDirectory(pathname);
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.storeFile(fileName, inputStream);
            inputStream.close();
            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }

    /**
     * 上传文件(可对文件进行重命名)
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器保存目录
     * @param filename
     *            上传到FTP服务器后的文件名称
     * @param originfilename
     *            待上传文件的名称(绝对地址)
     * @return
     */
    public static boolean uploadFileFromProduction(String hostname, int port,
            String username, String password, String pathname, String filename,
            String originfilename) {
        boolean flag = false;
        try {
            InputStream inputStream = new FileInputStream(new File(
                    originfilename));
            flag = uploadFile(hostname, port, username, password, pathname,
                    filename, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 上传文件(不可以进行文件的重命名操作)
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器保存目录
     * @param originfilename
     *            待上传文件的名称(绝对地址)
     * @return
     */
    public static boolean uploadFileFromProduction(String hostname, int port,
            String username, String password, String pathname,
            String originfilename) {
        boolean flag = false;
        try {
            String fileName = new File(originfilename).getName();
            InputStream inputStream = new FileInputStream(new File(
                    originfilename));
            flag = uploadFile(hostname, port, username, password, pathname,
                    fileName, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 删除文件
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器保存目录
     * @param filename
     *            要删除的文件名称
     * @return
     */
    public static boolean deleteFile(String hostname, int port,
            String username, String password, String pathname, String filename) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        try {
            // 连接FTP服务器
            ftpClient.connect(hostname, port);
            // 登录FTP服务器
            ftpClient.login(username, password);
            // 验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                return flag;
            }
            // 切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.dele(filename);
            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.logout();
                } catch (IOException e) {

                }
            }
        }
        return flag;
    }

    /**
     * 下载文件
     * 
     * @param hostname
     *            FTP服务器地址
     * @param port
     *            FTP服务器端口号
     * @param username
     *            FTP登录帐号
     * @param password
     *            FTP登录密码
     * @param pathname
     *            FTP服务器文件目录
     * @param filename
     *            文件名称
     * @param localpath
     *            下载后的文件路径
     * @return
     */
    public static boolean downloadFile(String hostname, int port,
            String username, String password, String pathname, String filename,
            String localpath) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        try {
            // 连接FTP服务器
            ftpClient.connect(hostname, port);
            // 登录FTP服务器
            ftpClient.login(username, password);
            // 验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                return flag;
            }
            // 切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            FTPFile[] ftpFiles = ftpClient.listFiles();
            for (FTPFile file : ftpFiles) {
                if (filename.equalsIgnoreCase(file.getName())) {
                    File localFile = new File(localpath + "/" + file.getName());
                    OutputStream os = new FileOutputStream(localFile);
                    ftpClient.retrieveFile(file.getName(), os);
                    os.close();
                }
            }
            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.logout();
                } catch (IOException e) {

                }
            }
        }
        return flag;
    }

}
package utils.ftp;

import junit.framework.TestCase;

public class FavFTPTest extends TestCase {

    public void testFavFTPUtil() {
        String hostname = "127.0.0.1";
        int port = 21;
        String username = "business";
        String password = "business";
        String pathname = "business/ebook";
        String filename = "big.rar";
        String originfilename = "C:\\Users\\Downloads\\Downloads.rar";
        FavFTPUtil.uploadFileFromProduction(hostname, port, username, password,
                pathname, filename, originfilename);
        // String localpath = "D:/";

        // FavFTPUtil.downloadFile(hostname, port, username, password, pathname,
        // filename, localpath);
    }

}

package utils.sftp;
/**
 * 描述:sftp服务器文件上传下载类
 * @author jss
 * @version 1.0, 2012-12-03
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
import java.util.Vector;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;


public class SFTPUploadBean {

 /**
  * 连接sftp服务器
  * @param host 主机
  * @param port 端口
  * @param username 用户名
  * @param password 密码
  * @return
  */
 public ChannelSftp connect(String host, int port, String username,String password) {
  ChannelSftp sftp = null;
  try {
   JSch jsch = new JSch();
   jsch.getSession(username, host, port);
   Session sshSession = jsch.getSession(username, host, port);
   System.out.println("Session created.");
   sshSession.setPassword(password);
   Properties sshConfig = new Properties();
   sshConfig.put("StrictHostKeyChecking", "no");
   sshSession.setConfig(sshConfig);
   sshSession.connect();
   System.out.println("Session connected.");
   System.out.println("Opening Channel.");
   Channel channel = sshSession.openChannel("sftp");
   channel.connect();
   sftp = (ChannelSftp) channel;
   System.out.println("Connected to " + host + ".");
   //System.out.println("登录成功");
  } catch (Exception e) {

  }
  return sftp;
 }

 /**
  * 上传文件
  * @param directory 上传的目录
  * @param uploadFile 要上传的文件
  * @param sftp
  */
 public void upload(String directory, String uploadFile, ChannelSftp sftp) {
  try {
   sftp.cd(directory);
   File file=new File(uploadFile);
   sftp.put(new FileInputStream(file), file.getName());
   System.out.println("上传成功!");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 下载文件
  * @param directory 下载目录
  * @param downloadFile 下载的文件
  * @param saveFile 存在本地的路径
  * @param sftp
  */
 public 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();
  }
 }

 /**
  * 删除文件
  * @param directory 要删除文件所在目录
  * @param deleteFile 要删除的文件
  * @param sftp
  */
 public void delete(String directory, String deleteFile, ChannelSftp sftp) {
  try {
   sftp.cd(directory);
   sftp.rm(deleteFile);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 列出目录下的文件
  * @param directory 要列出的目录
  * @param sftp
  * @return
  * @throws SftpException
  */
 public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException{
  return sftp.ls(directory);
 }

 public static void main(String[] args) {
  SFTPUploadBean sf = new SFTPUploadBean();
  String host = "192.168.0.1";
  int port = 22;
  String username = "root";
  String password = "root";
  String directory = "/home/httpd/test/";
  String uploadFile = "D:\\tmp\\upload.txt";
  String downloadFile = "upload.txt";
  String saveFile = "D:\\tmp\\download.txt";
  String deleteFile = "delete.txt";
  ChannelSftp sftp=sf.connect(host, port, username, password);
  sf.upload(directory, uploadFile, sftp);
  sf.download(directory, downloadFile, saveFile, sftp);
  sf.delete(directory, deleteFile, sftp);
  try{
   sftp.cd(directory);
   sftp.mkdir("ss");
   System.out.println("finished");
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

package utils.sftp;
import com.jcraft.jsch.ChannelSftp;


import junit.framework.TestCase;

public class SFTPUploadTestCase extends TestCase{
 public void testUpLoad(){     

      try {      
          SFTPUploadBean client = new SFTPUploadBean();
           ChannelSftp sftp = client.connect("127.0.0.1", 22, "admi", "admi");
          client.upload("/home/yonghu", "D:\\test.txt",  sftp);
            

      } catch (Exception e) {     
          e.printStackTrace();     

      }      

 }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值