如何在FTP服务器上传和下载文件

前提1:在本机上安装了ftp服务器,且配置正确。用户名:ftp 密码:pass (也可以修改程序)

前提2:已经导入了commons-net-3.3-sources.jar
                                  commons-net-3.3.jar
                                  commons-net-examples-3.3.jar  三个jar包

前提3:确认通过客户端,能够正常进入ftp服务器

前提4:使用linux系统

package ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;

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

/**
 * 功能
 * 1.将(指定文件)传输到ftp服务器的(指定文件夹下)   核心方法appenFile
 * 2.下载(指定文件夹下的指定文件),到本地(指定位置)  核心方法retrieveFile
 * 3.获取服务器上目录信息
 * @author vking
 *
 */

public class My_Ftp_Test
{
    /**
     * 获取到指定ftp服务器的链接
     *
     * @param hostname      ip地址
     * @param port                端口号
     * @param username    用户名
     * @param password        密码
     * @return
     * @throws SocketException
     * @throws IOException
     */
    public FTPClient getCon(String ip, int port, String username,
            String password) throws SocketException, IOException
    {
        FTPClient ftp = new FTPClient();// 获取到服务器代理对象

        // 输入ip和端口
        ftp.connect(ip, port);
        // 输入登录名和密码
        ftp.login(username, password);

        return ftp;
    }

    /**
     * 总结:listFiles 和listNames效果相同, 当不写参数时,输出ftp文件夹下的文件;写上目录后,输出指定文件夹下的文件(都包含文件夹)
     * 而listDirectories 输出指定目录下有多少个文件夹
     * @param ftp
     * @throws IOException
     */
    // 遍历ftp上所有文件 传入一个path判断是文件么,是打印:不是,获取他的文件集合,便利这个集合,再判断
    private static void getFtpFiles(FTPClient ftp) throws IOException
    {
        FTPFile[] listFiles = ftp.listFiles();
        System.out.println(listFiles.length);
        for (int i = 0; i < listFiles.length; i++)
        {
            System.out.println("listFiles()"+listFiles[i]);
        }
        FTPFile[] listFiles2 = ftp.listFiles("ftp");
        System.out.println(listFiles2.length);
        for (int i = 0; i < listFiles2.length; i++)
        {
            System.out.println("listFiles2(ftp)"+listFiles2[i]);
        }
        FTPFile[] listFiles3 = ftp.listFiles("ftp/mmj");
        System.out.println(listFiles3.length);
        for (int i = 0; i < listFiles3.length; i++)
        {
            System.out.println("listFiles3(ftp/mmj)"+listFiles3[i]);
        }
        
        FTPFile[] listDirectories = ftp.listDirectories();
        System.out.println( listDirectories.length);
          for (int i = 0; i < listDirectories.length; i++)
          {
          System.out.println("listDirectories()"+listDirectories[i].getName());   
          }
          FTPFile[] listDirectories2 =ftp.listDirectories("ftp");
          System.out.println(listDirectories2.length);
          for (int i = 0; i < listDirectories2.length; i++)
        {
              System.out.println("listDirectories2(ftp)"+listDirectories2[i]);
        }
        
        String[] listNames = ftp.listNames("ftp");
        System.out.println( listNames.length);
        for (int i = 0; i < listNames.length; i++)
        {
            System.out.println("listNames(ftp)::"+listNames[i]);
        }
        String[] listNames2 = ftp.listNames("ftp/mmj");
        System.out.println( listNames2.length);
        for (int i = 0; i < listNames2.length; i++)
        {
            System.out.println("listNames2(ftp/mmj)::"+listNames2[i]);
        }
    }

    /**
     * 向ftp服务器上传文件
     *
     * @param ftp
     * @param pathname
     *            文件名
     * @param putPath
     *            本地路径
     * @throws FileNotFoundException
     */
    public void putFile(FTPClient ftp, String pathname, String putPath)
            throws FileNotFoundException
    {
        boolean blog = false;
        File putFile = new File(putPath);
        String putName = putFile.getName();// 上传文件名称
        InputStream local = new FileInputStream(putFile);// 上传文件输入流
        try
        {

            // 在服务器上创建文件夹,如果存在不创建
            if (!ftp.changeWorkingDirectory(pathname))// 进入这个文件夹,如果失败,意味着不存在目录
            {
                ftp.makeDirectory(pathname); //创建目标文件夹
                ftp.changeWorkingDirectory(pathname);
            }
            
            // 在该文件夹下传入文件,如果文件已经存在,不再传入
            String[] listNames = ftp.listNames();
            System.out.println(listNames.length);
            for (int i = 0; i < listNames.length; i++)
            {
                System.out.println("listNames()::"+listNames[i]);
                if (putName.equals(listNames[i]))
                {
                    blog = true;
                    break;
                }
            }
            if (!blog)// 不存在该文件,则上传
            {
                ftp.appendFile(putName, local);
                System.out.println("文件上传成功!");
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally
        {
            close(local, ftp, null);
        }
    }

    /**
     *
     * 从ftp服务器下载文件
     * @param pathname        
     * @param fileName           
     * @param localPath         
     * @param ftp                  ftp代理
     * @param pathname     FTP服务器上的相对路径
     * @param fileName         要下载的文件名
     * @param localPath         下载后保存到本地的路径
     */
    public void downFile(FTPClient ftp, String pathname, String fileName,
            String localPath)
    {
        OutputStream is = null;
        try
        {
            ftp.changeWorkingDirectory(pathname);// 转移到FTP服务器目录
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs)
            {
                if (ff.getName().equals(fileName)) // 服务器是否存在该文件
                {
                    File localFile = new File(localPath + "/" + ff.getName());

                    is = new FileOutputStream(localFile);
                    ftp.retrieveFile(ff.getName(), is); // 从服务器下载文件,指定文件名和输出流
                }
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            close(null, ftp, is);
        }
    }

    public static void main(String[] args) throws SocketException, IOException
    {
        String ip = "127.0.0.1";
        int port = 21;
        String username = "ftp";
        String password = "pass";

        String pathname = "ftp/mmj";// 上传到ftp的路径

        String putPath = "test1.txt";
        String downPath = "/home/vking/workspace/my_2D/mmj";

        My_Ftp_Test myFtp = new My_Ftp_Test();

        FTPClient con = myFtp.getCon(ip, port, username, password);

        // 测试:FTPfile 是如何工作的
        getFtpFiles(con);
        myFtp.putFile(con, pathname, putPath);

       
        
        con = myFtp.getCon(ip, port, username, password);
        myFtp.downFile(con, pathname, putPath, downPath);// 这里不能直接用putPath,而应该用putName,但是由于是默认路径,所以可以这么写

    }

    // 关闭各种资源1.关闭文件输入流 2.关闭服务器连接3.关闭文件输出流
    public void close(InputStream local, FTPClient ftp, OutputStream os)
    {
        try
        {
            if (local != null)
            {
                local.close();
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        try
        {
            if (ftp != null)
            {
                if (ftp.isConnected())
                {
                    ftp.disconnect();
                }
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        try
        {
            if (os != null)
            {
                os.close();
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }

    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值