Java实现ftp的上传、下载和删除

前期准备

1. 搭建Ftp服务器

为了方便本地测试,一开始可以先在本地搭建Ftp服务器。搭建Ftp服务器的教程有很多,这里就不多讲了,下面是我用到的教程你们可以参考一下。
百度经验:Win10如何搭建FTP服务器

要注意几点:

  • 权限分配的时候要允许“读和写”,这样才可以确保上传和下载的顺利进行。
  • 不能用匿名登陆,不然会测试的时候FTPClient会连接不上。
  • 搭建完后可以自己先测试一下,用另一台电脑连接进行上传、下载和删除等操作。

2. 导入相关的包

实现这些功能要用到一个FTPClient类,需要从外部导入commons-net-3.6包。如果是不是Maven项目,只能从网络下载包。下载地址如下:
官网下载地址

如果是Maven项目,只需要添加相关依赖:

<dependency>
	<groupId>commons-net</groupId>
	<artifactId>commons-net</artifactId>
	<version>3.6</version>
</dependency>

ps:如果需要其他包的时候,可以到这个网站上找相关依赖怎么写。
https://mvnrepository.com/

正式开码

1. Ftp服务器的连接

连接ftp服务器之前需要用到以下参数,可以直接写死,有经常更改的需求的话可以选择从配置文件中读取。

ps:相关参数都填自己的,我这里是为了给个例子乱填的。

private static FTPClient ftpClient;          //创建对象
private static String ip = "192.168.0.1";    //ftp地址
private static Integer port = 21;            //ftp默认端口号是21
private static String userName = "Veggie";   //用户名 
private static String passWord = "root";	 //密码

接下来就是执行初始化操作,包括对量初始化、连接和登陆。
无法连接失败可能的原因:

  • 不在同一个局域网中,要在同一个局域网中才能连接。
  • 显示连接已经被重置,可以选择用IIS管理器重启Ftp服务器。再不行的话,可以先把创建的Ftp删除再重新创建。
public static boolean initFtpClient() throws Exception {
     boolean is_success = false;
     int reply;
     ftpClient = new FTPClient();
     try {
         ftpClient.connect(ip, port);			//连接Ftp服务器
         ftpClient.login(userName, passWord);  //登陆Ftp服务器
         ftpClient.setControlEncoding("utf-8");//设置编码类型
         reply = ftpClient.getReplyCode();     //获取返回码,用于判断是否连接成功
         if (!FTPReply.isPositiveCompletion(reply)) {
             throw new Exception("服务器连接失败");
         } else {
             ftpClient.enterLocalPassiveMode();  //设置被动模式
             ftpClient.setControlEncoding("GBK");//设置字符模式,解决中文乱码问题
             is_success = true;
         }
     } catch (Exception e) {
         e.printStackTrace();
     } 
     return is_success;
 }

虽然之前试过操作完成之后没有关闭连接,但是关闭连接应该还是有一定意义的,还是调用一下吧。

public static void dropFtpClient() {
    try {
        ftpClient.logout();     //退出登陆
        if (ftpClient.isConnected()) {//检测是否连接Ftp服务器
            ftpClient.disconnect(); //关闭连接
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2. 上传操作

如果上传有问题,有可能是没有开启给连接者分配“写”的权限

/**
 * 上传文件
 *
 * @param pathname       ftp服务保存地址
 * @param originfilename 待上传文件的名称(绝对地址) *
 * @return
 */
public static boolean uploadFile(String pathname, String originfilename) {
    boolean is_success = false;
    InputStream inputStream = null;
    try {
        File localFile = new File(originfilename);
        inputStream = new FileInputStream(localFile);
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        ftpClient.changeWorkingDirectory(pathname); //跳转到指定的Ftp文件目录(相对路径)
        is_success = ftpClient.storeFile(localFile.getName(), inputStream);//上传文件
        inputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return is_success;
}

3. 下载操作

这个下载操作是把该路径下所有的文件都下载来,也可以根据自己的需求改写为下载里面某个指定的文件。
相应的,如果在参数传递没有问题的情况下出现下载是失败的情况,就要去看看有没有“读”的权限。

扫描二维码关注公众号,回复: 9077474 查看本文章
/*
 * 下载文件
 *
 * @param pathName  ftp服务器文件目录
 * @param localPath 下载后的文件路径 *
 * @return
 */
public static boolean downloadFile(String pathName, String localPath) {
    boolean is_success = false;
    OutputStream os = null;
    try {
        ftpClient.changeWorkingDirectory(pathName);//跳转到指定的Ftp文件目录
        FTPFile[] ftpFiles = ftpClient.listFiles();//获取目录下所有的文件和文件夹
        //遍历目录下所有的文件
        for (FTPFile file : ftpFiles) {
            if (file.isFile()) {
                File localFile = new File(localPath + "/" + file.getName());
                os = new FileOutputStream(localFile);
                ftpClient.retrieveFile(file.getName(), os);//下载文件到本地
                os.close();
            } else if (file.isDirectory()) {
                downloadFile(pathName + file.getName() + "/", localPath);
            }
        }
        is_success = true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return is_success;
}

4. 删除操作

如果上面两个操作都没问题的话,一般删除也不会有问题。

/*
 * 删除文件
 *
 * @param pathName  ftp服务器文件目录
 * @param fileName  删除的文件名
 * @return
 */
public static boolean deleteFile(String pathNmae, String fileName) {
    boolean is_success = false;
    try {
        ftpClient.changeWorkingDirectory(pathNmae);
        is_success = ftpClient.deleteFile(fileName);//删除文件
    } catch (Exception e) {
        e.printStackTrace();
    }
    return is_success;
}

测试

虽然为了简化代码去掉了很多异常情况处理操作,但是在正常情况下还是可以完成上述操作的。有那么多功能总要测试一下,可以看到我们测试的步骤为:

  1. 初始化FtpClient
  2. 下载Ftp上的所有文件到本地
  3. 删除Ftp上的"1.jpg"
  4. 将刚下载的"1.jpg"图片上传到Ftp服务器
  5. 退出登陆、关闭连接
public static void main(String[] arg) throws Exception {
    boolean is_success = false;
    //初始化FtpClient
    is_success = initFtpClient();
    System.out.println(is_success);
    //下载Ftp上的所有文件到本地
    is_success=downloadFile("/","D:\\test0");
    System.out.println(is_success);
    //删除Ftp上指定文件
    is_success = deleteFile("/", "1.jpg");
    System.out.println(is_success);
    //将本地文件上传到Ftp服务器
    is_success = uploadFile("/","D:\\test0\\1.jpg");
    System.out.println(is_success);
    //退出登陆、关闭连接
    dropFtpClient();
}

通过观察控制台返回的信息,看到在我的电脑上测试是没有问题,可以到文件夹看看是不是真的成功了。
在这里插入图片描述
//看了一下,确实是成功了的

参考资料

关于这个参考资料,我一直都觉得很坑爹,在网上找的资料百分之五六十里面的内容都是一样的,而且都标注着原创(说原创起码要有点自己的东西嘛)。有的还直接把人家的内容直接复制上去,也不标注出处,连格式都懒得该一下,我也是醉了,开始莫名反感这种行为。
https://blog.csdn.net/lht931942788/article/details/80278916

发布了59 篇原创文章 · 获赞 103 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42292229/article/details/99824043