用Java实现FTP服务器上传下载

一、带入ftp客户端相关的jar

<!-- ftp连接start -->
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.5</version>
    </dependency>
<!-- ftp连接end-->

二、新建FTPClient客户端

public static FTPClient init(){
        FTPClient ftpClient = new FTPClient();
        try {
            // 连接FTP服务器
            ftpClient.connect(HOSTNAME, PORT);
            //获取服务器返回码
            int reply = ftpClient.getReplyCode();
            //验证服务器是否连接成功
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                logger.error("FTPServer 拒绝连接");
                return null;
            }
            // 登录FTP服务器
            boolean result =ftpClient.login(USERNAME, PASSWORD);

            //验收是否登录成功
            if (!result) {
                logger.error("ftpClient登陆失败!");
                throw new Exception("ftpClient登陆失败! userName:"+ USERNAME + " ; password:"
                        + PASSWORD);
            }
            //设置传输的编码格式
            ftpClient.setControlEncoding("UTF-8");
            //设置文件类型(这个采用二进制格式)
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            //设置为主动模式(pass)
            ftpClient.enterLocalPassiveMode();
            //创建目录
            ftpClient.makeDirectory(PATHNAME);
            //切换到新建的目录
            ftpClient.changeWorkingDirectory(PATHNAME);
        }catch (Exception e) {
            logger.equals(e);
        }
        return ftpClient;
    }

三、上传文件

ftpClient.storeFile(fileName , inputStream);

其中fileName是保存在ftp中的文件名,inputString为文件的内容;

四、下载文件
列出ftp当前目录下的所有文件,如果文件名相同,则保存文件到本地

FTPFile[] ftpFiles = ftpClient.listFiles();
FTPFile file=ftpFiles[0];
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);

其中localFile为本地的文件路径,file位ftp服务器的文件

五、删除文件

ftpClient.dele(pathname);

pathname为ftp服务器文件路径

六、删除文件夹与文件夹下面的所有子文件和文件夹
列出所有文件和文件夹,然后用遍历删除所有文件
FTPFile[] files = ftpClient.listFiles(ftpPath);
删除文件夹
flag = ftpClient.removeDirectory(ftpPath);

7、代码如下:

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

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.eakom.common.util.ftpPool.FTPClientFactory;


public class TestFTPClient {
    private static Logger logger = LoggerFactory.getLogger(TestFTPClient.class);
    /**FTP服务器的IP地址*/
    private static final String HOSTNAME="192.168.158.98";
    /**FTP服务器的端口*/
    private static final int PORT=21;
    /**FTP服务器的登录名*/
    private static final String USERNAME="ftpadmin";
    /**FTP服务器的密码*/
    private static final String PASSWORD="eakom123456";
    /**FTP服务器的操作路径*/
    private static final String PATHNAME="/home/ftpadmin/aa";

    public static void main(String[] args) throws UnsupportedEncodingException {
        InputStream inputStream = null;
        try {
            String path="C:/Users/Administrator/Desktop/44/中文.txt";
            File file = new File(path);
            inputStream = new FileInputStream(file);
            FTPClient ftpClient=init();
            String fileName = file.getName();
            boolean flag = ftpClient.storeFile(new String(fileName.getBytes("GBK"), "iso-8859-1") , inputStream);
            System.out.println(flag);
        } catch (IOException e) {
            logger.error("上传失败",e);
        }
    }
    /**
     * 上传文件
     * @param ftpClient
     * @throws IOException 
     */
    public void upload(FTPClient ftpClient) throws IOException{
        InputStream inputStream = null;
        try {
            String path="C:/Users/Administrator/Desktop/44/中文.txt";
            File file = new File(path);
            inputStream = new FileInputStream(file);
            String fileName = file.getName();
            boolean flag = ftpClient.storeFile(new String(fileName.getBytes("GBK"), "iso-8859-1") , inputStream);   
            ftpClient.logout();
        } catch (IOException e) {
            logger.error("上传失败",e);
        }
    }
    /**
     * 下载文件
     * @param ftpClient
     * @param filename  下载的文件名
     * @throws IOException
     */
    public void download(FTPClient ftpClient,String filename) throws IOException{
        FTPFile[] ftpFiles = ftpClient.listFiles();
        for (FTPFile file : ftpFiles) {
            if (filename.equalsIgnoreCase(file.getName())) {
                File localFile = new File("C:/Users/Administrator/Desktop" + "/" + file.getName());
                OutputStream os = new FileOutputStream(localFile);
                ftpClient.retrieveFile(file.getName(), os);
                os.close();
            }
        }
        ftpClient.logout();
    }
    /**
     * 
     * @param ftpClient
     * @param pathname 文件路径名
     * @throws IOException
     */
    public void deleteFile(FTPClient ftpClient,String pathname) throws IOException{
        ftpClient.dele(pathname);
        ftpClient.logout();
    }

    public static FTPClient init(){
        FTPClient ftpClient = new FTPClient();
        try {
            // 连接FTP服务器
            ftpClient.connect(HOSTNAME, PORT);
            //获取服务器返回码
            int reply = ftpClient.getReplyCode();
            //验证服务器是否连接成功
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                logger.error("FTPServer 拒绝连接");
                return null;
            }
            // 登录FTP服务器
            boolean result =ftpClient.login(USERNAME, PASSWORD);

            //验收是否登录成功
            if (!result) {
                logger.error("ftpClient登陆失败!");
                throw new Exception("ftpClient登陆失败! userName:"+ USERNAME + " ; password:"
                        + PASSWORD);
            }
            //设置传输的编码格式
            ftpClient.setControlEncoding("UTF-8");
            //设置文件类型(这个采用二进制格式)
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            //设置为主动模式(pass)
            ftpClient.enterLocalPassiveMode();
            //创建目录
            ftpClient.makeDirectory(PATHNAME);
            //切换到新建的目录
            ftpClient.changeWorkingDirectory(PATHNAME);
        }catch (Exception e) {
            logger.equals(e);
        }
        return ftpClient;
    }
    /**
     * 删除文件夹与文件夹下面的所有子文件和文件夹
     * @param ftpClient
     * @param ftpPath
     * @return
     * @throws IOException
     */
    private static boolean DeleteDir(FTPClient ftpClient, String ftpPath)
            throws IOException {
        FTPFile[] files = ftpClient.listFiles(ftpPath);
        boolean flag = false;
        for (FTPFile f : files) {
            String path = ftpPath + File.separator + f.getName();
            if (f.isFile()) {
                // 是文件就删除文件
                ftpClient.deleteFile(path);
            } else if (f.isDirectory()) {
                if(f.getName()!=null&&!".".equals(f.getName())&&!"..".equals(f.getName())){
                    DeleteDir(ftpClient, path);
                }
            }
        }
        // 每次删除文件夹以后就去查看该文件夹下面是否还有文件,没有就删除该空文件夹
        FTPFile[] files2 = ftpClient.listFiles(ftpPath);
        if (files2.length == 2) {
            flag = ftpClient.removeDirectory(ftpPath);
        } else {
            flag = false;
        }
        return flag;
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值