【实战-干货】手把手带你搭建自己的FTP服务器,实现文件上传、下载

article/2025/8/21 3:05:37


  • 💂 个人主页: IT学习日记
  • 🤟 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦
  • 💅 想进入【技术圈子】、请查看左边导航栏介绍!走过、路过、别错过!

文章大纲

  • 🏘️ 一、前言
  • 🏚️ 二、专栏推荐
  • 🏠 三、Window系统FTP服务器搭建
    • ♈ 3.1、FTP服务器怎么玩
    • ♉ 3.2、FTP(File Transfer Protocol,文件传输协议)
    • ♊ 3.3、FTP服务器
    • ♋ 3.4、FTP服务器搭建
    • ♌ 3.5、FTP服务器搭建出现的问题
  • 🏡 四、通过程序实现FTP文件的上传和下载
    • 💗 4.1、项目结构
    • 💙 4.2、实现技术
    • 💚 4.2、相关配置
    • 💛 4.3、核心代码
    • 💜 4.4、执行结果
    • 💝 4.5、开发过程中遇到的坑
  • 🚀 六、写在最后

一、前言

🏘️ 一、前言


  • 大家好,我是小诚,在开始学习之前,先给大家推荐下最近筹划的【技术圈子】,在没有更文的20多天里,一直在梳理之前的文章知识和学习资源,现在已经初步梳理完成,圈子中所有资源都免费分享,资源包括但不限于面试资源、简历模板、年终汇报PPT、CSDN VIP下载资源等等,感兴趣者请点击【技术圈子】,期待您的加入。

  • 如果文章对你有帮助,可以帮忙一键三连和专栏订阅哦!

  • 本篇文章重点介绍:Window环境搭建FTP服务器,JAVA程序实现FTP服务器文件上传、下载功能。


二、专栏推荐

🏚️ 二、专栏推荐


  良心推荐: 下面的相关技术专栏还在免费分享哦,大家可以帮忙点点订阅哦!

  面试干货专栏

  常见开发问题专栏

  JAVA进阶知识专栏

  从0到1-全面深刻理解MySQL系列专栏


三、Window系统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管理控制台】=> 点击确定等待安装完成


安装Windows的FTP组件

  步骤二: 打开IIS管理器

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


IIS管理平台

  步骤三: 创建FTP服务器

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

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


在这里插入图片描述

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

在这里插入图片描述


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


在这里插入图片描述

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

在这里插入图片描述


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

在这里插入图片描述

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

在这里插入图片描述

♌ 3.5、FTP服务器搭建出现的问题


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

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

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


在这里插入图片描述


四、通过程序实现FTP文件的上传和下载

🏡 四、通过程序实现FTP文件的上传和下载


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

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


💗 4.1、项目结构


在这里插入图片描述

💙 4.2、实现技术


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

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

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

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>

💚 4.2、相关配置


ftp:client:# ftp客户端文件使用的字符集charset: GBKserver:# 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、上传核心代码:

/*** 上传** @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、下载核心代码:

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、演示代码:

演示代码


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

上传文件到FTP服务器

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

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


💝 4.5、开发过程中遇到的坑


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

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

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

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


在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

五、写在最后

🚀 六、写在最后


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

  推荐一下: 【技术圈子】中有免费面试资源、简历模板、年终汇报PPT、CSDN VIP下载资源等等,期待您的加入!【不是一个人的圈子,而是技术人的圈子】

  感兴趣者可以扫描下面二维码或者查看左边导航栏进入技术圈子。


http://chatgpt.dhexx.cn/article/toBrsOdW.shtml

相关文章

ftp服务器搭建

一&#xff0c;vsftpd的安装 1.为了方便后续的配置建议用root登录。或者切换到root用户。 2.检查是否安装vsftpd。 [rootlocalhost ~]# vsftpd -v如果没有安装使用yum安装。 [rootlocalhost ~]# yum -y install vsftpd3.安装完成后,查看位置 [rootlocalhost ~]# whereis vs…

WEB、FTP服务器的搭建

一、Web服务器搭建 打开控制面板。 点击程序。 点击启动或关闭Windows功能。 找到Internet Information services两栏&#xff0c;进行打钩&#xff08;注意.NET Framework 3.5 &#xff08;.NET2.0和3.0&#xff09;若没有显示小黑点&#xff0c;则需要去官网下载&#…

Ubuntu FTP服务器搭建(内网和公网)

1、安装vsftpd # sudo apt-get install vsftpd 若提示Unable to locate package&#xff08;未发现软件包&#xff09;&#xff0c;则需要先更新源列表/etc/apt/source.list文件。 Ubuntu源&#xff1a;http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1%A8 执行&#x…

frp内网穿透实现外网可访问的ftp(FileZillaServer)服务器(web服务器,远程桌面连接都可以)

目录 1.总结和资源链接 2.搭建frp服务器 3.windows客户端连接到frp服务器&#xff0c;实现内网穿透 4.在windows本机开启ftp服务&#xff0c;即完成了外网可访问的ftp服务器搭建 1.总结和资源链接 本教程以系统为centos7的阿里云服务器ECS作为frp服务器&#xff0c;windows本…

在NAT内网搭建FTP服务器,并允许外网访问

零 由于本人主机位于路由器NAT后&#xff0c;所以校园网其他用户无法访问本地局域网内的FTP服务器&#xff0c;因此需要在路由器及本地主机进行一些设置&#xff0c;使路由器转发外网数据到本地主机。 一 由于Windows自带的FTP管理繁琐&#xff0c;所以选择FileZilla Server…

ftp服务器搭建并通过外网访问

内网FTP如何端口映射到外网连接访问&#xff1f;通过公网路由器映射或nat123端口映射均可实现。前者是硬件公网端口映射&#xff0c;后者是软件内网端口映射&#xff0c;目的一样&#xff0c;方法不一。 工具/原料 FTP内网nat123客户端 方法/步骤 ftp搭建&#xff1a; 1. 按【W…

设置frp端口映射实现ftp服务内网穿透

设置frp端口映射实现ftp服务内网穿透 前提: frp服务器需要首先在VPS上搭建好&#xff0c;搭建教程:http://koolshare.cn/thread-65379-1-1.html 1. 设置被动端口范围 这里以本机搭建FileZilla Server为例子&#xff0c;首先设置被动模式的端口范围。 此处设置为50000-50002。可…

【计算机网络课程设计】内网穿透、搭建FTP服务器(局域网和广域网)以及对于花生壳发送X11包得一些推测

搭建FTP服务器、对X11包的推测 FTP概述一、FTP工作模式及传输模式FTP工作模式1、主动模式2、被动模式 FTP传输模式1、ASCLL传输模式2、二进制数据传输模式 二、FTP服务器搭建1、搭建工具2、Serv_U服务器配置 三、基于局域网的文件传输1、主机通过资源管理器、浏览器FTP服务器2、…

用旧手机搭建服务器并实现内网穿透不需要root(本人亲测很多次最简单的一个)

相信每个人都有一部或几部旧手机&#xff0c;放着也是放着还不如使其变废为宝&#xff0c;接下来我就向大家介绍如何搭建属于自己的服务器&#xff0c;并实现内网穿透。 相关软件已放到最后 首先我们要搭建一个本地服务器KSWEB&#xff0c;Aidlearning&#xff0c;这两款软件…

内网windows server搭建ftp服务器

一. 有两种方式 1.windows中使用IIS搭建ftp服务器&#xff08;本人尝试并未成功,fileZilla只能主动模式下才能连接,未达到想要的效果&#xff09; 2.使用fileZilla server 搭建ftp服务器 二.本次讲解第二种方式 使用fileZilla server搭建ftp服务器 1.下载FileZilla Server …

FileZilla搭建FTP服务器图解教程,并允许外网访问NAT内网

FTP是用来在两台计算机之间传输文件&#xff0c;是Internet中应用非常广泛的服务之一。FTP服务是网络中经常采用的资源共享方式之一。FTP协议有PORT和PASV两种工作模式&#xff0c;即主动模式和被动模式 。今天我分享一个最近我自己在WINDOWS 10搭建FTP服务器的经验给大家&…

使用JAVA连接Mysql数据库,并完成相关操作

Java 访问 MySQL 通过使用JDBC让JAVA程序连接到数据库&#xff0c;并完成增删改查等操作。 大致步骤&#xff1a; 1、Mysql与eclipse、jdk等的下载&#xff08;以及环境变量配置等&#xff0c;这里不做详细说明&#xff09;。 2、将mysql-connector-java-5.1.8-bin.jar添加到ec…

javamysql

文章目录 1、初识MySQL1.1、数据库分类 2、列类型2.1、数值2.2、字符串2.3、事件日期 3、字段属性4、表操作4.1、字符集编码4.2、修改表结构4.3、清除表 5、DQL查询数据&#xff08;最重点&#xff09;5.1、DQL5.2、查询去重5.3、数据库的表达式5.4、模糊查询5.5、连表查询5.6、…

java实现操作MySQL

java对mysql数据库的操作分为以下几个步骤&#xff1a; 1.加载mysql jdbc驱动 //加载mysql jdbc驱动Class.forName("com.mysql.cj.jdbc.Driver");2.获取连接 获取连接需要两步&#xff0c;一是使用DriverManager来注册驱动&#xff0c;二是使用DriverManager来获取…

Java+MysQL:Java连接MysQL及进行简单的查询操作

最近想学习一下Java操作MySQL等数据库的教程,但是把整个网络翻遍也没找到令人满意的教程,各种报错,所以就决定,把自己的学习过程记录下来和大家分享,既可以作为日后复习巩固之用,又可以帮到需要的人,希望可以帮助以后想学习的朋友们少走一些弯路。大家一起交流共勉吧。 …

简单介绍Java连接MySQL数据库执行数据库操作

简介&#xff1a;在一般的项目开发中&#xff0c;无不用到对数据库的操作&#xff0c;这些操作无非也就是一些增删改查等操作。那么我们的Java如何操作数据库进行相关的数据操作呢&#xff0c;这里我们需要一个驱动程序&#xff0c;即JDBC驱动&#xff0c;JDBC包含两层&#xf…

数据库 —— Java操作MySQL

系列文章 数据库 —— MySQL 01 数据库 —— MySQL 02 数据库 —— Java操作MySQL 文章目录 系列文章十、JDBC10.1 什么是JDBC10.2、JDBC程序10.2.1、封装工具类10.2.2、SQL注入问题及解决 10.3、使用IDEA连接数据库10.4、JDBC操作事务10.5、数据库连接池 十、JDBC 10.1 什么…

Java-mysql:MYSQL数据操作

添加记录&#xff1a;1.一次添加一条记录&#xff1a;INSERT [INTO] 数据表名[(字段名称1&#xff0c;2……)] {VALUE|VALUES}(值1&#xff0c;2……);2.一次添加多条记录&#xff1a;INSERT [INTO] 数据表名[(字段名称1&#xff0c;2……)] VALUES(值1&#xff0c;2……),(值1…

java JDBC操作Mysql解析

一. 概念&#xff1a; Java DataBase Connectivity Java 数据库连接&#xff0c; Java语言操作数据库。JDBC本质&#xff1a;其实是官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口。各个数据库厂商去实现这套接口&#xff0c;提…

java对mysql的简单操作——增加数据

java连接mysql5.1教程&#xff08;含代码&#xff09; 查询数据 下面是数据添加片段的代码 Connection conn null; Statement stmt null; PreparedStatement psnull;try{// 注册 JDBC 驱动Class.forName(JDBC_DRIVER);// 打开链接//连接数据库conn DriverManager.getConne…