永夜-Evernight

永夜降临之前,你都有改变的资格

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

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

1 下载需要的jar包

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

img

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");
        }
    }

}

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,让更多的人能够享受到获取知识的快乐!因为本人初入职场,鉴于自身阅历有限,所以本博客内容大部分来源于网络中已有知识的汇总,欢迎各位转载,评论,大家一起学习进步!如有侵权,请及时和我联系,切实维护您的权益!

版权声明

作者:CS408

出处:https://www.cnblogs.com/lixuwu/p/5715615.html


标题:Apache FtpServer 实现文件的上传和下载
作者:luomuren
地址:http://luomuren.top/articles/2021/09/08/1631107492664.html