写点什么

【摸鱼高手】搭个自己的 FTP 服务器玩玩,java 基础笔试题大全带答案

作者:MySQL神话
  • 2021 年 11 月 28 日
  • 本文字数:3212 字

    阅读完需:约 11 分钟

操作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 服务器的搭建,可以手动将文件上传到服务器,让在同一网段的小伙伴自由从上面下载,但是,在实际业务开发中,我们需要的是通过程序实现上传和下载,而不是通过人为手动的方式,下面,就来看看如何实现吧。


?? 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: 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-The filename, directory name, or volume label syntax is incorrect. 。


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



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


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


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


要写全路径。

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:


(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构.........实在是太多了)


其次分享一些技术知识,以截图形式分享一部分:


Tomcat 架构解析:



算法训练+高分宝典:



Spring Cloud+Docker 微服务实战:



最后分享一波面试资料:


切莫死记硬背,小心面试官直接让你出门右拐


1000 道互联网 Java 面试题:



Java 高级架构面试知识整理:



本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
【摸鱼高手】搭个自己的FTP服务器玩玩,java基础笔试题大全带答案