zoukankan      html  css  js  c++  java
  • 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");
            }
        }
    
    }
  • 相关阅读:
    意向锁
    锁升级
    使用SQL SERVER PROFILER 捕获和分析死锁
    用Go写一个聊天软件
    Js中的一个日期处理格式化函数
    javascript format 字符串 函数
    php 读取excel 时间列
    PHP发送post请求
    javascript getElementsByClassName扩展函数
    [ASP.NET] Session 详解
  • 原文地址:https://www.cnblogs.com/lixuwu/p/5715615.html
Copyright © 2011-2022 走看看