"Это второй день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г.".
- 💬 Если статья была вам полезна,Добро пожаловать, чтобы подписаться, поставить лайк, добавить в избранное (один клик три раза) и подписаться на колонку.
🏘️ 1. Введение
-
Привет всем, я Сяочэн. Прежде чем я начну учиться, я хотел бы порекомендовать недавно запланированный [Технический кружок]. За более чем 20 дней без обновления я разбирал знания предыдущих статей и учебных ресурсов, а теперь это было предварительно.
圈子中所有资源都免费分享,资源包括但不限于面试资源、简历模板、年终汇报PPT、CSDN VIP下载资源等等
, Если необходимо, нажмите на домашнюю страницу, чтобы просмотреть и с нетерпением ждать вашего присоединения. -
如果文章对你有帮助,可以帮忙一键三连和专栏订阅哦!
-
В этой статье основное внимание уделяется:
Window环境搭建FTP服务器,JAVA程序实现FTP服务器文件上传、下载功能。
🏚️ 2. Полный эффект
1、上传文件到FTP服务器:
2、从FTP服务器下载文件到本地:
🏠 3. Создание FTP-сервера оконной системы
Прежде чем создавать FTP-сервер, позвольте мне представить вам, что такое FTP-сервер.不然怕有些小伙伴可能只是有个模糊的概念,学习要尽量知其然,知其所以然,不要一知半解,否则自己用着也不踏实。
♈ 3.1 Как играть на FTP-сервере
在介绍前,我们先来看看搭建完FTP服务器后能怎么玩
, иначе всегда найдутся друзья, которые почувствуют, что статья слишком длинная, и убегут, прочитав половину, и больше не будет, если пропустят!
1. Загружайте и загружайте небольшие видеоролики (общие файлы), настраивайте контроль разрешений и контролируйте пользователей.
2. Реализовать хранение файлов и загрузку файлов в некоторых бизнес-сценариях (например, операции файлового сервера).
3, больше геймплеев ждут, пока вы разработаете, дайте полную волю своему мозгу...
♉ 3.2, FTP (протокол передачи файлов, протокол передачи файлов)
Давайте кратко разберемся с протоколом FTP.FTP — это аббревиатура от File Transfer Protocol.Это член семейства протоколов TCP/IP и один из самых ранних протоколов, используемых в Интернете.通过它可以实现电脑与电脑间对文件的各种操作(如文件的增、删、改、查、传送等),FTP的目标是提高文件的共享性,提供非直接使用远程计算机,实现计算机文件的相互操作,使存储介质对用户透明和可靠高效地传送数据。
Он разработан на основе модели C/S (клиент/сервер), работает на прикладном уровне в сетевой архитектуре и использует TCP для передачи, чтобы обеспечить надежное соединение между клиентом и сервером.
支持的连接方式:
FTP поддерживает два режима подключения: Стандартный (режим PORT, активный режим) и Пассивный (PASV, пассивный режим).Процесс подключения примерно следующий:
1.Клиент FTP инициирует сеанс FTP и устанавливает соответствующее соединение с сервером FTP.Во время сеанса FTP устанавливает два соединения: процесс управляющей информации и процесс данных.
2、控制进程连接的用途:
Он используется для передачи управляющей информации, такой как внутренние команды FTP и ответы на команды, и передача данных не может быть выполнена.
3、数据进程连接的用途:
Он используется для передачи данных между клиентом и сервером.Он является полнодуплексным и может поддерживать двунаправленную передачу данных.Когда передача данных будет завершена, она будет отменена, а затем вернется в состояние сеанса FTP до тех пор, пока процесс управления соединением не будет завершен. также отменено. Закройте весь FTP-сеанс.
PORT模式:
Клиент FTP создаст соединение с TCP-портом сервера 21 (控制连接
), используется для отправки команд. Когда клиенту необходимо получить данные, он отправит имя ПОРТ на сервер через это соединение. Команда PORT содержит, какой порт будет использоваться для получения данных, передаваемых сервером. В это время, сервер пройдет Создайте соединение с FTP-клиентом на TCP-порту 20 (数据连接
) для завершения передачи данных.
Passive模式:
Клиент FTP создаст соединение с TCP-портом сервера 21 (控制连接
), используется для отправки команд, когда клиенту нужно получить данные, он отправит имя Pasv на сервер через это соединение,服务器收到Pasv命令后,打开一个临时端口(端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求
, клиент подключается к этому порту FTP-сервера, и затем FTP-сервер будет передавать данные через этот порт.
Примечание. Ознакомиться с приведенным выше введением в протокол FTP можно в энциклопедии Baidu:FTP-протокол
♊ 3.3 FTP-сервер
Поймите протокол FTP, тогда FTP-сервер легко понять. FTP-сервер — это сервер, поддерживающий FTP-протокол.Обычно мы можем установить FTP-инструмент на компьютер для реализации передачи файлов с помощью FTP-сервера.FTP-серверы обычно делятся на: FTP-сервер Windows и FTP-сервер Linux.
Наш собственный компьютер также может быть использован в качестве FTP-сервера.Например, система Windows может использовать встроенный менеджер ISS для создания FTP-сервера (本文案例就是使用这个
), система Linux чаще всего используется для создания FTP-сервера с помощью программного обеспечения vsftp.
常见的例子:
При прохождении компьютерных классов или компьютерных экзаменов в школе учитель помещает темы класса или экзаменационные темы в папку и разрешает учащимся доступ к определенному адресу, например: ftp://ip-адрес, через этот адрес каждый ученик может видеть файл, предоставленный учителем, и соответствующие тестовые вопросы, загруженные для завершения теста.
Студенты, которые прошли компьютерный класс в приведенном выше примере, должны были это испытать (какая замечательная студенческая эпоха). То, что студенты получают доступ, на самом деле является FTP-сервером, созданным учителем. Учитель заранее загружает общие файлы на FTP-сервер. , и учащиеся могут скачать его и так далее.
Много многословного и многословного, давайте начнем строительство FTP-сервера и разработку функции загрузки и выгрузки!
♋ 3.4 Настройка FTP-сервера
安装环境:
Win10
步骤一:
Установите поддержку FTP-сервера и платформу управления IIS.
操作步骤:
Компьютер => Панель управления => Программы и компоненты => Включение и отключение компонентов Windows => Информационные службы Интернета => Отметьте [FTP-сервер] и [Консоль управления IIS] в инструментах веб-управления => Нажмите «ОК» и дождитесь завершения установки.
步骤二:
Откройте диспетчер 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-сервер в брандмауэре.
解决:
Computer => Панель управления => Windows Defender Firewall => Разрешить приложения для связи через брандмауэр Windows Defender => Проверьте [FTP-сервер]
🏡 В-четвертых, загружайте и скачивайте файлы по FTP через программу
С помощью вышеперечисленных шагов мы завершили построение FTP-сервера.Вы можете вручную загружать файлы на сервер, чтобы друзья в том же сегменте сети могли свободно скачивать с него.但是,在实际业务开发中,我们需要的是通过程序实现上传和下载,而不是通过人为手动的方式,下面,就来看看如何实现吧。
说明:
В статье размещена только часть кода, весь код кейса выложен на Gitee, кому нужно может напрямую зайти и скачать (Не забудьте поставить звезду, если это поможет): [Фактический бой - создание FTP-сервера для загрузки и выгрузки】
💗 4.1 Структура проекта
💙 4.2 Технология реализации
1、Apache下的commons-net依赖包:
Он содержит набор сетевых утилит и реализаций протоколов.Поддерживаемые протоколы включают: FTP, NNTP, NTP, POP3(S), SMTP(S), Telnet, Whois и другие.可以用它来实现文件的上传和下载功能。
2、spring-boot-starter-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: 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、上传核心代码:
/**
* 上传
*
* @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服务器:
3、从FTP服务器下载文件到本地:
💝 4.5 Яма, обнаруженная при разработке
问题1、连接FTP服务器失败:
问题描述:
Учетная запись и пароль указаны в конфигурационном файле, но соединение не устанавливается.
解决方案
:После расследования выяснилось, что при построении FTP-сервера была включена только анонимная аутентификация, а базовая аутентификация (способ входа в систему с учетной записью и паролем) не была включена.Вам нужно только включить [Базовую аутентификацию] в диспетчер IIS.
解决步骤:
Компьютер => Панель управления => Администрирование => Диспетчер IIS => Настройка FTP-сервера => FTP-аутентификация => Включить режим базовой аутентификации.
问题2、FTP上传中文文件失败:
问题描述:
Выберите имя файла на английском языке для обычной загрузки, но выберите имя файла на китайском языке для загрузки, но произойдет сбой, появится сообщение об ошибке: 550 — Неверный синтаксис имени файла, имени каталога или метки тома.
解决方案
:После расследования было обнаруженоFTP协议里面,规定文件名编码为iso-8859-1(注意:这个现在是在Windows搭建的FTP服务器出现的情况,如果是Linux环境的话,还需要查看linux默认的支持编码而定,但是需要将上传的文件名编码这个步骤是确定的),所以目录名或文件名需要转码。
Таким образом, в коде загружаемого файла вы увидите следующий код для декодирования и повторного кодирования файла:
问题3、调用FTPClient的切换目录方法changeWorkingDirectory总是失败
原因和解决:
При построении FTP-сервера нам нужно сформулировать общий путь к файлу.Когда мы устанавливаем соединение с FTP-сервером, он находится в этом каталоге по умолчанию.Если вы хотите переключиться в подкаталог под этим каталогом, вам не нужно напишите полный путь.
示例:
Если путь к папке, совместно используемой FTP-сервером, следующий: D:/ftpserver, то нам нужно переключиться на демонстрационный подфайл в папке ftpserver,正确的写法:fTPClient.changeWorkingDirectory("demo")
вместо fTPClient.changeWorkingDirectory("D:/ftpserver/demo")
问题4、从FTP服务器下载的文件破损,无法打开
问题描述:
Я попытался загрузить файл с именем файла китайскими иероглифами с FTP-сервера, но после того, как он был успешно загружен на локальный, его не удалось нормально открыть, что свидетельствует о его повреждении.
问题原因:
Причина на самом деле та же, что и во втором вопросе, потому что имя файла, содержащее китайские иероглифы, нужно закодировать при скачивании, иначе его нельзя будет открыть после скачивания.
🚀 Шесть, напиши в конце
Все коды реального боевого проекта FTP-сервера загружены в Gitee, и вы можете забрать его, если вам это нужно (он будет загружен на CSDN для бесплатного скачивания позже),如果有帮助不要忘了star哦
, проект Gitee через поезд выглядит следующим образом: [Фактический бой - создание FTP-сервера для загрузки и выгрузки】
推荐一下:
[Технический круг] Существуют бесплатные ресурсы для интервью, шаблоны резюме, отчет на конец года PPT, ресурсы для загрузки CSDN VIP и т. д., с нетерпением жду вашего присоединения!
感兴趣者可查看主页进入。