Windows搭建FTP服务器,JAVA实现读写功能

  • 2021-12-16
  • Admin

目录

博主介绍

? 个人主页:苏州程序大白

? 个人社区:CSDN全国各地程序猿

?作者介绍:中国DBA联盟(ACDU)成员,CSDN全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室,2021年注册苏州凯捷智能科技有限公司

?如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦

?️ 承接软件APP、小程序、网站等开发重点行业应用开发(SaaS、PaaS、CRM、HCM、银行核心系统、监管报送平台、系统搭建、人工智能助理)、大数据平台开发、商业智能、App开发、ERP、云平台、智能终端、产品化解决方案。测试软件产品测试、应用软件测试、测试平台及产品、测试解决方案。运维数据库维护(SQL Server 、Oracle、MySQL)、 操作系统维护(Windows、Linux、Unix等常用系统)、 服务器硬件设备维护、网络设备维护、 运维管理平台等。运营服务IT咨询 、IT服务、业务流程外包(BPO)、云/基础设施的管理、线上营销、数据采集与标注、内容管理和营销、设计服务、本地化、智能客服、大数据分析等。

? 有任何问题欢迎私信,看到会及时回复

? 微信号:stbsl6,微信公众号:苏州程序大白

? 想加入技术交流群的可以加我好友,群里会分享学习资料

在这里插入图片描述

开启FTP功能

首先打开控制面板–>程序–>启用或关闭Windows功能:
在这里插入图片描述
勾选FTP服务、Web管理工具、万维网服务:

在这里插入图片描述
点击完成,等待生效:
在这里插入图片描述

放行端口

打开Windows防火墙–>允许应用通过防火墙–>点击更改设置,勾选FTP服务器的公用和专用:
在这里插入图片描述

重启计算机

完成上面的操作后,重启计算机。

添加FTP访问用户

可选操作,如果是设置匿名访问FTP,或者直接使用Windows已有的用户,就不用创建用户。

打开计算机管理功能–>本地用户和组,选择用户,右键新用户:

在这里插入图片描述
设置用户名和密码,勾选不能修改密码和密码永不过期,取消勾选其他的,点击创建:
在这里插入图片描述

添加FTP站点

打开计算机管理功能,在服务中找到Internet Information Services,选中左侧用户,右键添加FTP站点:
在这里插入图片描述
自定义站点名称,选择FTP要共享的文件路径:
在这里插入图片描述
设置IP地址为本机IP地址,端口默认21就行,如果没有SSL就选无SSL:
在这里插入图片描述
勾选身份验证为基本,选择授权为指定用户,指定可以访问的用户,勾选权限为写入和读取(这里可根据具体情况自定义,如果要设置匿名访问的话就勾选匿名,然后允许访问里面选择所有用户),然后点击确定:
在这里插入图片描述

本地访问测试

文件管理器输入ip地址加端口:
在这里插入图片描述
鼠标右键,选择登录(如果没有弹出登录界面的话,匿名访问则无此操作)
在这里插入图片描述
输入用户名和密码点击登录:
在这里插入图片描述
可以正常访问:
在这里插入图片描述
修改文件名测试是否可以进行修改:
在这里插入图片描述
测试远程访问FTP(需要在同一个网络环境下):
在这里插入图片描述
完成上面步骤,就可以访问呢。

修改FTP设置

打开计算机管理功能,在服务中找到Internet Information Services,展开计算机用户–>网站,双击创建的FTP服务器,然后就可以进行各种修改了:
在这里插入图片描述

  • 添加所有用户访问:

双击FTP身份验证,启用匿名身份验证:
在这里插入图片描述
双击FTP授权规则,右键添加允许规则:
在这里插入图片描述
选择所有用户,然后勾选读取和写入权限,点击确定即可,再次访问时就不用输入密码了。
在这里插入图片描述

Java整合FTP代码实现

FTP文件删除实现:

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

import java.io.File;
import java.io.IOException;
/**
* @author 苏州程序大白
* @create 2021/12/16
* @desc 文件删除 (暂未实现删除路径内子文件夹功能)
*/
public class DeleteFTP {
    /**
     * @param pathName     要删除文件/目录所在ftp路径
     * @param fileName     要删除文件所在ftp的文件名
     * @param ftpClient    FTPClient对象
     */
    public void deleteFTP(String pathName, String fileName, FTPClient ftpClient) {

        try {
            ftpClient.changeWorkingDirectory(pathName);// 跳转到文件目录
            ftpClient.enterLocalPassiveMode(); //设置被动模式传输
            if (fileName != null && fileName != "") {
                //文件名不为空,删除指定文件
                ftpClient.deleteFile(pathName + File.separator + fileName);
                System.out.println("删除成功");
            } else {
                //文件名为空,删除路径下所有文件
                System.out.println("正在删除");
                //删除文件
                FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
                for (FTPFile file : files) {

                    if (file.isFile()) {
                        //判断为文件,直接删除
                        ftpClient.deleteFile(pathName + File.separator + file.getName());
                        System.out.println(file + ":已完成删除操作");
                    }
                    if (file.isDirectory()) {
                        /*有点问题,建议使用线程优化
                        //判断是文件夹,递归删除子文件夹内文件
                        deleteFTP(pathName + File.separator + file.getName(), null, ftpClient);
                        */
                    }
                }
                //删除文件夹
                ftpClient.removeDirectory(pathName);
                System.out.println("删除操作完成");
            }
        } catch (Exception e) {
            System.out.println("删除失败");
            e.printStackTrace();
        } finally {
            //关闭连接
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
      }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

FTP文件下载实现:

package org.example;

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

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* @author 苏州程序大白
* @create 2021/12/16
* @desc 文件下载(暂未实现下载路径内子文件中文件功能)
*/
public class DownloadFTP {
    /**
     * @param pathName     要下载文件所在ftp路径
     * @param fileName     要下载文件所在ftp的文件名
     * @param downloadPath 文件下载后保存的路径
     * @param ftpClient    FTPClient对象
     */
    public void downLoadFTP(String pathName, String fileName, String downloadPath, FTPClient ftpClient) {

        OutputStream outputStream = null;
        try {
            ftpClient.changeWorkingDirectory(pathName);// 跳转到文件目录
            ftpClient.enterLocalPassiveMode(); //设置被动模式传输

            if (fileName != null && fileName != "") {
                //文件名不为空,下载指定文件
                File filePath = new File(downloadPath);
                if (!filePath.exists()) {
                    filePath.mkdir();//目录不存在,创建目录
                }
                outputStream = new FileOutputStream(new File(downloadPath + File.separator + fileName));
                ftpClient.retrieveFile(fileName, outputStream);
                System.out.println("下载操作完成");
            } else {
                FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
                //文件名为空,下载路径下所有文件(不包含文件夹)
                for (FTPFile file : files) {
                    File filePath = new File(downloadPath);
                    if (!filePath.exists()) {
                        filePath.mkdir();//目录不存在,创建目录
                    }
                    File downloadFile = new File(downloadPath + File.separator + file.getName());
                    outputStream = new FileOutputStream(downloadFile);
                    ftpClient.retrieveFile(file.getName(), outputStream);

                    System.out.println("下载操作完成:" + downloadFile);
                }
            }

        } catch (Exception e) {
            System.out.println("下载失败");
            e.printStackTrace();
        } finally {
            //关闭连接
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
            if(null != outputStream){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

连接FTP代码实现:

package org.example;

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

import java.io.IOException;
import java.net.MalformedURLException;
/**
* @author 苏程序大白
* @create 2021/12/16
* @desc 连接FTP服务链接
*/

public class InitFTP {

    //ftp服务器IP
    private static final String host = "127.0.0.1";
    //ftp服务器端口号默认为21
    private static final Integer port = 21;
    //ftp登录账号
    private static final String username = "ahzoo";
    //ftp登录密码
    private static final String password = "123456";

    public void initFtpClient(FTPClient ftpClient) {
        ftpClient.setControlEncoding("utf-8"); //设置编码
        try {
            System.out.println("正在连接FTP服务器:" + host + ":" + port);
            ftpClient.connect(host, port); //连接ftp服务器
            ftpClient.login(username, password); //登录ftp服务器
            int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
            if(!FTPReply.isPositiveCompletion(replyCode)){
                System.out.println("FTP服务器连接失败:" + host + ":" + port);
            }
            System.out.println("FTP服务器连接成功:" + host + ":" + port);
        }catch (MalformedURLException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

移动文件所在ftp路径代码实现:

package org.example;

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

import java.io.File;
import java.io.IOException;
/**
* @author 苏程序大白
* @create 2021/12/16
* @desc 文件移动/重命名
*/
public class MoveFTP {
    /**
     * @param pathName     要移动文件所在ftp路径
     * @param fileName     要移动文件所在ftp的文件名
     * @param movePath     文件移动后的路径
     * @param moveName     文件移动后的文件名(与源文件一致时实现只移动不重命名,不一致则实现了移动+重命名)
     * @param ftpClient    FTPClient对象
     */
    public void moveFTP(String pathName, String fileName, String movePath, String moveName, FTPClient ftpClient) {
        try {
            ftpClient.enterLocalPassiveMode(); //设置被动模式传输
            if (!ftpClient.changeWorkingDirectory(movePath)) {
                //跳转到目标路径失败时创建目标目录
                ftpClient.makeDirectory(movePath);
            }
            if (moveName != null && moveName != "") {
                ftpClient.changeWorkingDirectory(pathName);// 跳转回需要进行操作的目录
                //移动后的文件名不为空,移动目标文件
                //ftpClient.rename(旧文件名, 新路径)
                ftpClient.rename(fileName, movePath + File.separator + moveName);
                System.out.println("文件移动操作已完成:" + movePath + File.separator + moveName);
            } else {
                //移动后的文件名为空,移动目标路径所有文件

                ftpClient.changeWorkingDirectory(pathName);// 跳转回需要进行操作的目录
                FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合

                for (FTPFile file : files) {
                    ftpClient.rename(file.getName(), movePath + File.separator + file.getName());
                    System.out.println("移动操作完成:" + file.getName());
                }
            }

        } catch (Exception e) {
            System.out.println("移动失败");
            e.printStackTrace();
        } finally {
            //关闭连接
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e
			

免费ERP

61ebf17978942.jpg

 注册    登录 

用户名: demo; 密码: 123456

联系站长

QQ:769220720

Copyright © SibooSoft All right reserved 津ICP备19011444号