0

0

【摸鱼高手】搭个自己的FTP服务器玩玩

絕刀狂花

絕刀狂花

发布时间:2025-08-01 08:12:15

|

719人浏览过

|

来源于php中文网

原创

?️ 一、前言大家好,我是小诚,在开始学习之前,先给大家推荐下最近筹划的【技术圈子】,在没有更文的20多天里,一直在梳理之前的文章知识和学习资源,现在已经初步梳理完成,** 本篇文章重点介绍:**Window环境搭建FTP服务器,JAVA程序实现FTP服务器文件上传、下载功能。** ?️ 二、完成效果

1、上传文件到ftp服务器:

【摸鱼高手】搭个自己的FTP服务器玩玩

2、从FTP服务器下载文件到本地:

【摸鱼高手】搭个自己的FTP服务器玩玩
? 三、Window系统FTP服务器搭建

  在搭建FTP服务器之前,先跟大家介绍下什么是FTP服务器,**不然怕有些小伙伴可能只是有个模糊的概念,学习要尽量知其然,知其所以然,不要一知半解,否则自己用着也不踏实。**

♈ 3.1、FTP服务器怎么玩

  **在介绍前,我们先来看看搭建完FTP服务器后能怎么玩**,不然总是有些小伙伴觉的文章太长看到一半就跑路了,错过就没有了!

  1、上传、下载小视频(共享文件),自定义权限控制,控制使用用户。

  2、实现某些业务场景下文件存储和文件下载(即文件服务器操作)。

  3、更多玩法等你开发,尽情发挥你的脑洞...

♉ 3.2、FTP(File Transfer Protocol,文件传输协议)

  先简单认识下FTP协议,FTP即文件传输协议的简称,它是TCP/IP协议簇中的一员,也是Internet上最早使用的协议之一,**通过它可以实现电脑与电脑间对文件的各种操作(如文件的增、删、改、查、传送等),FTP的目标是提高文件的共享性,提供非直接使用远程计算机,实现计算机文件的相互操作,使存储介质对用户透明和可靠高效地传送数据。**

  它是基于C/S(客户端/服务端)模型设计,工作在网络体系结构中的应用层,使用TCP进行传输,保证客户与服务器之间的连接是可靠的。

支持的连接方式:

  FTP支持Standard (PORT方式,主动方式),Passive (PASV,被动方式)两种连接模式,连接的流程大致如下:

  1、FTP客户端发起FTP会话,与FTP服务器建立相应的连接,在会话期间,FTP会建立控制信息进程与数据进程两个连接。

2、控制进程连接的用途: 用于传输FTP内部命令以及命令的响应等控制信息,无法进行数据传输。

3、数据进程连接的用途: 用于客户端与服务端之间数据的传输,它是全双工的,可以支持双向数据传输,当数据传输完成后,它就会撤销然后回到FTP会话状态,直到控制连接进程也取消,退出整个FTP会话。

PORT模式:

  FTP客户端会与服务端的TCP 21端口创建连接(控制连接),用于发送命令,当客户端需要接收数据时,会通过这个连接向服务端发送PORT命名,PORT命令中包含了会使用什么端口来接收服务端传输的数据,此时,服务端会通过TCP 20端口跟FTP客户端创建连接(数据连接)完成数据传输。

Passive模式:

  FTP客户端会与服务端的TCP 21端口创建连接(控制连接),用于发送命令,当客户端需要接收数据时,会通过这个连接向服务端发送Pasv命名,**服务器收到Pasv命令后,打开一个临时端口(端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求**,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口传送数据。

  说明:上面FTP协议知识介绍参考百度百科:FTP协议

♊ 3.3、FTP服务器

  了解了FTP协议,那FTP服务器就很容易理解了。FTP服务器就是支持FTP协议的服务器,我们平常可以在电脑上安装一个FTP工具就可实现与FTP服务器进行文件传输,FTP服务器常见分为:Windows FTP服务器和Linux FTP服务器。

我们自己的电脑也可以当做一个FTP服务器,如Windows系统就可以通过自带的ISS管理器来搭建一个FTP服务器(本文案例就是使用这个),Linux系统最常用的借助vsftp软件做FTP服务器搭建。

常见的例子: 在学校里上电脑课或者电脑考试时,老师会将上课题目或者考试题目放在某个文件夹中,让学生访问某个地址如:ftp://ip地址,通过这个地址每位同学看到老师共享的文件,下载的对应的试题完成考试。

  上面例子上过电脑课的同学应该都经历过(多么美好的学生时代),学生们访问到的其实就是老师搭建好的FTP服务器,老师提前将共享的文件上传到FTP服务器,学生们可以进行下载等操作。

  啰啰嗦嗦了一大堆,下面开始进行FTP服务器搭建和上传下载功能开发吧!

♋ 3.4、FTP服务器搭建

安装环境: Win10

步骤一: 安装FTP服务器支持和IIS管理平台。

操作步骤: 电脑 => 控制面板 => 程序和功能 => 启用和关闭Windows功能 => Internet Infomation Services => 勾选【FTP服务器】和Web管理工具的【IIS管理控制台】=> 点击确定等待安装完成

【摸鱼高手】搭个自己的FTP服务器玩玩

步骤二: 打开IIS管理器

操作步骤: 电脑 => 控制面板 => 管理工具 => Internet Infomation Services(IIS)管理器

【摸鱼高手】搭个自己的FTP服务器玩玩

步骤三: 创建FTP服务器

操作1: 在某个盘符如D盘,创建一个FTP共享文件夹,用于FTP共享文件存放地址

步骤2: 右键IIS管理器左边导航栏 => 添加FTP站点

【摸鱼高手】搭个自己的FTP服务器玩玩

步骤3: 指定【站点名称】和【FTP共享的文件夹路径】

AI大学堂
AI大学堂

科大讯飞打造的AI学习平台

下载
【摸鱼高手】搭个自己的FTP服务器玩玩

步骤4: 配置FTP服务器相关信息

【摸鱼高手】搭个自己的FTP服务器玩玩

步骤5: 配置FTP服务器验证和权限信息【**注意:如果想通过程序实现上传、下载功能,身份验证中的基本选项需要勾选上,后面程序需要通过这个方式使用账号和密码登录到FTP服务器**】

【摸鱼高手】搭个自己的FTP服务器玩玩

步骤5: 到这一步,一个FTP服务器就已经搭建完成了,在IIS管理器还可以对搭建好的FTP服务器进行配置管理。

【摸鱼高手】搭个自己的FTP服务器玩玩

步骤6: 在同一网段的小伙伴可以通过:**ftp://ftp配置的ip地址** 格式访问到FTP服务器。

【摸鱼高手】搭个自己的FTP服务器玩玩
♌ 3.5、FTP服务器搭建出现的问题

问题一: FTP按照流程搭建完成后,在同一网段的小伙伴却无法访问!

原因: 可能是开启了防火墙拦截,需要在防火墙放行FTP服务器。

解决: 电脑 => 控制面板 => Windows Defender 防火墙 => 允许应用通过Windows Defender 防火墙进行通信 => 勾选【FTP服务器】

【摸鱼高手】搭个自己的FTP服务器玩玩
? 四、通过程序实现FTP文件的上传和下载

  通过上面的步骤,我们完成了FTP服务器的搭建,可以手动将文件上传到服务器,让在同一网段的小伙伴自由从上面下载,**但是,在实际业务开发中,我们需要的是通过程序实现上传和下载,而不是通过人为手动的方式,下面,就来看看如何实现吧。**

说明: 文章只贴出部分代码,全部案例代码已经上传到Gitee,需要者可直接访问下载(有帮助记得给个star呀):【实战-FTP服务器搭建,实现上传、下载】

? 4.1、项目结构
【摸鱼高手】搭个自己的FTP服务器玩玩
? 4.2、实现技术

1、Apache下的commons-net依赖包: 它包含了一组网络实用工具和协议实现,支持的协议包括:FTP、NNTP、NTP、POP3(S)、SMTP(S)、Telnet、Whois等等,**可以用它来实现文件的上传和下载功能。**

2、spring-boot-starter-web: web相关支持

3、SpringBoot依赖: 快速构建JAVA项目

代码语言:javascript代码运行次数:0运行复制
                    org.springframework.boot            spring-boot-starter-web                                    commons-net            commons-net            3.6                                    org.springframework.boot            spring-boot-starter        
? 4.2、相关配置代码语言:javascript代码运行次数:0运行复制
ftp:  client:    # ftp客户端文件使用的字符集    charset: GBK  server:    # ftp服务器绑定ip或者域名    hostname: 127.0.0.1    # 端口    port: 21    # 连接ftp服务器的用户名    username: user    # 密码    password: 123456    # ftp的共享文件路径    workingPath: D:/share/FTPServer    # ftp服务器文件使用的字符集(用于上传包含中文名的文件和下载包含中文名的文件 - 很重要)    charset: ISO-8859-1
? 4.3、核心代码

  因为FTP服务器的上传、下载都是很通用的功能,**所以博主封装成了一个工具类,有需要的小伙伴可以引入依赖和相关配置后,直接就可以使用该工具类。**

1、上传核心代码:

代码语言:javascript代码运行次数:0运行复制
/**     * 上传     *     * @return     */    public boolean upload(FtpUploadParam param) {        boolean flag = false;        FTPClient ftpClient = new FTPClient();        //1 测试连接        if (connect(ftpClient, param.getHostname(), param.getPort(), param.getUsername(), param.getPassword())) {            try {                //2 检查工作目录是否存在,不存在则创建                if (!ftpClient.changeWorkingDirectory(param.getWorkingPath())) {                    ftpClient.makeDirectory(param.getWorkingPath());                }                // 将文件编码成Ftp服务器支持的编码类型(FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。)                String fileName = new String(param.getSaveName().getBytes(ftpClientCharset), ftpServerCharset);                // 3 上传文件                if (ftpClient.storeFile(fileName, param.getInputStream())) {                    flag = true;                } else {                    log.warn("FtpUtils uploadFile unsuccessfully!!");                }            } catch (IOException e) {                log.error("FtpUtils upload in error:{}", e);            } finally {                disconnect(ftpClient);            }        }        return flag;    }

2、下载核心代码:

代码语言:javascript代码运行次数:0运行复制
public boolean download(FtpDownloadParam param, String downloadFileName) {        FTPClient ftpClient = new FTPClient();        FileOutputStream out = null;        //1 测试连接        if (connect(ftpClient, param.getHostname(), param.getPort(), param.getUsername(), param.getPassword())) {            try {                File file;                String localPath = param.getDownloadPath() + param.getFileName();                out = new FileOutputStream(new File(localPath));                //2 检查工作目录是否存在,不存在返回//                if (!ftpClient.changeWorkingDirectory(param.getWorkingPath())) {//                    return false;//                }                /*                 * 打开FTP服务器的PASS模式(不记得FTP协议支持的模式请翻到文章第一阶段)                 * 这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据. 因为ftp                 * server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,可能出现出现阻塞                 */                ftpClient.enterLocalPassiveMode();                // 设置文件的传输方式                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);                // 将文件编码成Ftp服务器支持的编码类型(FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。)                // 缺少编码转换会导致:从FTP服务器下载下来的文件是破损的,无法被打开                boolean b = ftpClient.retrieveFile(new String(downloadFileName                        .getBytes(clientCharset), serverCharset), out);                out.flush();            } catch (IOException e) {                log.error("FtpUtils upload in error:{}", e);                return false;            } finally {                try{                    if(Objects.nonNull(out)){                        out.close();                    }                }catch (Exception e){                    log.error("FtpUtils upload in error:{}", e);                }                disconnect(ftpClient);            }        }        return true;    }
? 4.4、执行结果

1、演示代码:

【摸鱼高手】搭个自己的FTP服务器玩玩

2、上传文件到FTP服务器:

【摸鱼高手】搭个自己的FTP服务器玩玩

3、从FTP服务器下载文件到本地:

【摸鱼高手】搭个自己的FTP服务器玩玩
? 4.5、开发过程中遇到的坑

问题1、连接FTP服务器失败:

问题描述: 在配置文件中指定了账号和密码,但是却连接失败。

解决方案: 经过排查,发现是在搭建FTP服务器的时候只开启了匿名验证,没有开启基本验证(账号和密码登录的方式),只需要到IIS管理器中开启【基本验证】即可。

解决步骤: 电脑 => 控制面板 => 管理工具 => IIS管理器 => 搭建好的FTP服务器 => FTP身份验证 => 开启基本身份验证模式。

【摸鱼高手】搭个自己的FTP服务器玩玩

问题2、FTP上传中文文件失败:

问题描述: 选择文件名为英文的文件上传正常,但是选择中文的文件名上传却失败,错误信息:550-The filename, directory name, or volume label syntax is incorrect. 。

解决方案: 经过排查,发现 FTP协议里面,规定文件名编码为iso-8859-1(注意:这个现在是在Windows搭建的FTP服务器出现的情况,如果是Linux环境的话,还需要查看linux默认的支持编码而定,但是需要将上传的文件名编码这个步骤是确定的),所以目录名或文件名需要转码。 所以在上传文件代码处你会看到下面的对文件解码再编码的代码:

【摸鱼高手】搭个自己的FTP服务器玩玩

问题3、调用FTPClient的切换目录方法changeWorkingDirectory总是失败

原因和解决: FTP服务器搭建的时候需要我们制定共享的一个文件路径,当我们和FTP服务器建立连接后,默认就在这个目录下了,如果想切换到该目录下的子目录,不需要写全路径。

示例: 如果FTP服务器共享的文件夹路径为:D:/ftpserver,此时我们需要切换到ftpserver文件夹下的子文件demo中,**正确的写法:fTPClient.changeWorkingDirectory("demo") ** 而不是 fTPClient.changeWorkingDirectory("D:/ftpserver/demo")

【摸鱼高手】搭个自己的FTP服务器玩玩

问题4、从FTP服务器下载的文件破损,无法打开

问题描述: 尝试从FTP服务器下载有中文字符文件名的文件,成功下载到本地后却无法正常打开,提示已经破损。

问题原因: 原因其实和第二个问题一样,是因为包含中文字符的文件名下载时需要进行编码转换,否则下载后无法被打开。

【摸鱼高手】搭个自己的FTP服务器玩玩
? 六、写在最后

  **FTP服务器实战项目所有代码都已上传到Gitee,有需要可以自取(后面会传到CSDN免费下载),如果有帮助不要忘了star哦**,Gitee项目直通车如下:【实战-FTP服务器搭建,实现上传、下载】

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

117

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

68

2026.01.26

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

399

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

578

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

880

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1135

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

807

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

455

2023.08.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.4万人学习

Git 教程
Git 教程

共21课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号