Apache FtpServer 实现文件的上传和下载

1 下载需要的jar包

Ftp服务器实现文件的上传和下载,主要依赖jar包为:

 

2 搭建ftp服务器

参考Windows 上搭建Apache FtpServer,搭建ftp服务器

 

 3 主要代码

在eclipse中实现ftp的上传和下载功能还是很简单的,在编码过程中遇到的一个bug就是对于ftp中中文文件的下载不是乱码,就是下载后文件的大小是0KB。后来发现问题在于eclipse的编码,更改为“utf-8”,在上传和下载的时候,设置ftp服务端目录的名字,编码为iso-8859-1格式。

复制代码
package T0728;

import java.io.FileInputStream;
import java.io.FileOutputStream;

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

class FtpUtil {
    private FTPClient ftpClient;
    private String serverIp;
    private int port;
    private String userName;
    private String passWord;
    public FtpUtil(String serverIp, int port, String userName, String passWord) {
        super();
        this.serverIp = serverIp;
        this.port = port;
        this.userName = userName;
        this.passWord = passWord;
    }
    
    /**
     * 连接ftp服务器
     * @return
     */
    public boolean open(){
        if(ftpClient != null && ftpClient.isConnected())
            return true;
        //连接服务器
        try{
            ftpClient = new FTPClient();
            ftpClient.connect(serverIp, port);    //连接服务器
            ftpClient.login(userName, passWord);    //登录
            
            ftpClient.setBufferSize(1024);
            //设置文件类型,二进制
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            
            int reply = ftpClient.getReplyCode();
            if(!FTPReply.isPositiveCompletion(reply)){ //判断ftp服务器是否连通
                this.closeFtp();
                System.out.println("FtpServer连接失败!");
                return false;
                
            }
            return true;
        }catch(Exception e){
            this.closeFtp();
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 关闭ftp服务器,主要是对disconnect函数的调用
     */
    public void closeFtp() {
       try {
           if (ftpClient != null && ftpClient.isConnected())
            ftpClient.disconnect();
       } catch (Exception e) {
           e.printStackTrace();
       }
       System.out.println("Close Server Success :"+this.serverIp+";port:"+this.port);
    }
    
    /**
     * 从ftp服务器下载文件
     * @param ftpDirectoryAndFileName 包含ftp部分的文件路径和名字,这里是从ftp设置的根目录开始
     * @param localDirectoryAndFieName 本文的文件路径和文件名字,相当于是绝对路径
     * @return
     */
    public boolean donwLoad(String ftpDirectoryAndFileName,String localDirectoryAndFieName){
        if(!ftpClient.isConnected()){
            return false;
        }
        FileOutputStream fos =null;
        try {
            fos = new FileOutputStream(localDirectoryAndFieName);
            //下面的函数实现文件的下载功能,参数的设置解决了ftp服务中的中文问题。这里要记得更改eclipse的编码格式为utf-8
            ftpClient.retrieveFile(new String(ftpDirectoryAndFileName.getBytes(), "iso-8859-1"), fos);
            fos.close();
            return true;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return false;
        }finally{
            
            this.closeFtp();
        }    
        
    }
    
    /**
     *从本地上传文件到ftp服务器
     * @param ftpDirectoryAndFileName
     * @param localDirectoryAndFieName
     * @return
     */
    public boolean upLoading(String ftpDirectoryAndFileName,String localDirectoryAndFieName){
        if(!ftpClient.isConnected()){
            return false;
        }
        
        FileInputStream fis = null;
        
        try {
            fis = new FileInputStream(localDirectoryAndFieName);
            //和文件的下载基本一致,但是要注意流的写法
            ftpClient.storeFile(new String(ftpDirectoryAndFileName.getBytes(), "iso-8859-1"), fis);
            fis.close();
            return true;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return false;
        }finally{
            this.closeFtp();
        }
    }
    
    

}
复制代码

测试代码 

复制代码
package T0728;

public class FtpMain {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        FtpUtil ftpUtil = new FtpUtil("168.33.51.174", 2121, "admin", "123456");
        if(ftpUtil.open()){
            //ftpUtil.donwLoad("/中.txt", "E:/ftp2/中文.txt");
            ftpUtil.upLoading("/hh/2.mp3", "E:/ftp2/1.mp3");
        }
    }

}
复制代码

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,让更多的人能够享受到获取知识的快乐!因为本人初入职场,鉴于自身阅历有限,所以本博客内容大部分来源于网络中已有知识的汇总,欢迎各位转载,评论,大家一起学习进步!如有侵权,请及时和我联系,切实维护您的权益!
posted @   CS408  阅读(2593)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2015-07-28 (转)云计算 杂谈
点击右上角即可分享
微信分享提示