【日常开发之FTP】Windows开启FTP、Java实现FTP文件上传下载

news2024/10/7 18:27:53

【日常开发之FTP】windows开启FTP、Java实现FTP文件上传下载

  • FTP前言
    • FTP是什么?
    • FTP两种模式
  • Windows开启FTP
    • FTP windows 配置
    • 防火墙配置
  • Java部分
    • Maven配置
    • 创建FTPClient
  • 注意

FTP前言

FTP是什么?

FTP是一个专门进行文件管理的操作服务,一般来讲可以在任意的操作系统之中进行配置,但是如果考虑到简便性,一般来讲可以直接在Linux系统下进行安装。
FTP (File Transfer Protocol、文件传输协议)是TCP/IP协议中的一部分,属于应用层协议。使用FTP最主要的功能是对文件进行管理,所以在FTP内部对于文件支持有两种传输模式:文本模式(ASCII、默认)和二进制模式(Binary),通常文本文件使用ASCIl模式,而对于图片、视频、声音、压缩等文件则会使用二进制的方式进行传输。
FTP的操作一般是分为服务端以及客户端两个组成部分,客户端需要通过特定的FTP服务进行服务器的连接(大部分的FTP服务器上都是需要进行用户登录认证的)。

FTP两种模式

如果要进行FTP文件的管理,则客户端一定要与FTP服务器进行连接,在FTP中每一次通讯实际上都需要有两个连接存在,一个连接专门用于传输FTP命令、另外一个连接负责数据传送,所以在FTP中一般会支持两种不同的工作模式:一种是Standard模式(也被称为PORT模式),另外一种是Passive (也被称为PASV模式),这两种模式的概念如下:

PORT主动模式
当客户端与服务端连接后,客户端会打开一个新的本地端口,随后将此端口告诉给FTP服务端,这样FTP服务端就会主动的连接到FTP客户端公布的端口,随后进行数据传送。

PASV被动模式
FTP在定义的时候就公布了一个操作端口(一般为21端口),这样当客户端连接之后会明确的知道该操作端口并且进行数据传送。

在实际的FTP运行机制之中,如果要想通过FTP服务进行操作,则一般会使用被动模式,在所有的系统中几乎都会存在有防火墙的概念,如果要考虑到客户端的方便使用的话,被动的模式会更加的合理。

Windows开启FTP

进入控制面板–》程序–》启用或关闭windows功能
在这里插入图片描述
开启FTP服务勾选红色方框内的选项点击确定

在这里插入图片描述

FTP windows 配置

win + R 输入 inetmgr

在这里插入图片描述

进入如下界面
在这里插入图片描述
箭头指向点击–》右键添加FTP站点
在这里插入图片描述

站点名称:FTP
物理路径:选择你FTP开放的路径
在这里插入图片描述
注意:这个ip地址要配你暴露出去的地址,如果是作为FTP服务器,要保证这个ip其他节点能够ping通
选择无ssl
在这里插入图片描述
这里的用户可以指定用户也可以选择所有用户
权限要写读写,不然无法进行上传下载
在这里插入图片描述
双击左侧FTP
在这里插入图片描述
查看各项信息是否正确
在这里插入图片描述
在这里插入图片描述

防火墙配置

控制面板–》系统安全–》Windows Defender 防火墙–》允许的应用中勾选FTP
在这里插入图片描述
点击我的电脑右键选择管理右键用户,选择新用户添加
在这里插入图片描述

Java部分

Maven配置

    	<dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.8.0</version>
        </dependency>

创建FTPClient

上传

public static void main(String[] args) throws IOException {
        String server = "192.168.0.121";
        int port = 21;
        String user = "ftp";
        String pass = "123456";
        FTPClient ftp = new FTPClient();
        FileInputStream fileInputStream =null;
        try {
            ftp.connect(server, port);
            ftp.login(user, pass);
            //这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据
            ftp.enterLocalPassiveMode();
            // 二进制文件传输
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

            ftp.setControlEncoding("UTF-8");
            ftp.setBufferSize(2048);

            // 上传文件的路径
            String remoteFilePath = "/WorkSpace/啊啊啊.csv";
            //远程路径一定要进行编码否则上传失败
            remoteFilePath = new String(remoteFilePath.getBytes("GBK"), "iso-8859-1");
            // 本地文件的路径
            String localFilePath = "/WorkSpace/Test/啊啊啊.csv";
            // 使用storeFile上传文件
            if (ftp.storeFile(remoteFilePath,fileInputStream = new FileInputStream(new File(localFilePath)))) {
                System.out.println("文件上传成功");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (ftp.isConnected()) {
                    ftp.logout();
                    ftp.disconnect();
                }
                //手动关流
                if(fileInputStream!=null){
                    fileInputStream.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

下载

//我这边项目运行是在D盘所以不需要加盘符
//remoteFile  FTP路径 /WorkSpace/Test/啊啊啊.csv
//localFile   要存储到本地的路径
private static void download(FTPClient ftpClient, String remoteFile, String localFile) {
        OutputStream outputStream = null;
        try {
            ftpClient.enterLocalPassiveMode();
            outputStream = Files.newOutputStream(Paths.get(localFile));
            // ftp默认使用ISO-8859-1编码格式,所以这里需要转换为ISO-8859-1,“解决文件名为中文时,下载后为空文件的问题”
            String remoteFileName = new String(remoteFile.getBytes("GBK"), StandardCharsets.ISO_8859_1);
            ftpClient.retrieveFile(remoteFileName, outputStream);
        } catch (IOException ex) {
            System.out.println("DownLoad Error: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                ftpClient.disconnect();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

注意

在开发过程中遇到了一些问题,各位在用时可能会遇到,在上传时遇到上传失败,我这边是因为文件名是中文的问题
转码一下就好了
remoteFilePath = new String(remoteFilePath.getBytes("GBK"), StandardCharsets.ISO_8859_1);
然后就是下载时发现文件为空文件
还是转码一下就好了
String remoteFileName = new String(remoteFile.getBytes("GBK"), StandardCharsets.ISO_8859_1);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1659369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java后端15问!

前言 最近一位粉丝去面试一个中厂&#xff0c;Java后端。他说&#xff0c;好几道题答不上来&#xff0c;于是我帮忙整理了一波答案 G1收集器JVM内存划分对象进入老年代标志你在项目中用到的是哪种收集器&#xff0c;怎么调优的new对象的内存分布局部变量的内存分布Synchroniz…

【0day漏洞复现】中移铁通禹路由器信息泄露漏洞

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

移动端自动化测试工具 Appium 之 main 启动

文章目录 一、背景二、生成xml文件2.1、创建xml方法2.2、执行主类MainTest2.3、自动生成的xml2.4、工程目录2.5、执行结果 三、命令行执行appium服务四、主方法启动类五、集成Jenkins六、总结 一、背景 Jenkins 做集成测试是不错的工具&#xff0c;那么UI自动化是否可以&#…

两种方法合并3dtiles(分别使用js/java)

目录 前言&#xff1a; 需合并的json目录 aa/tileset.json bb/tileset.json cc/tileset.json dd/tileset.json ee/tileset.json js源码&#xff1a; 运行命令&#xff1a; 生成结果&#xff1a; java源码&#xff1a; Matrix.java ThreeDTilesJoin2.java pom文件…

Rust 适合哪些场景?

目录 二、Rust 适合哪些场景&#xff1f; 三、Rust 社区的发展趋势如何&#xff1f; 四、Rust 快速搭建一个WebServer服务器 一、Rust是什么&#xff1f; Rust是一门赋予每个人构建可靠且高效软件能力的语言。 Rust 程序设计语言 一门帮助每个人构建可靠且高效软件的语言。…

2024年美国市场亚太游戏品牌数字广告洞察报告

来源&#xff1a;Sensor Tower 美国是全球最大的游戏市场之一&#xff0c;也是亚太游戏品牌出海的重要市场。2023年Q2至2024年Q1&#xff0c;美国市​场广告投放额排名前10的亚太游戏品牌&#xff0c;合计支出 超过7.5亿美元&#xff0c;环比上涨23%。 排名第一的米哈游(miHoY…

【将Maven源改为国内阿里云镜像源】

目录 一、如何配置Maven镜像源&#xff1f; 二、Idea中的Maven配置 ​三、项目与你本地仓库和中央仓库的联系 一、如何配置Maven镜像源&#xff1f; 1、打开你的Maven用户设置文件(settings.xml)。默认情况下&#xff0c;该文件存在于你的用户目录下的.m2文件夹中。如果你没…

内网安全-隧道技术SSHDNSICMPSMB上线通讯LinuxMac 简单总结

第126天&#xff1a;内网安全-隧道技术&SSH&DNS&ICMP&SMB&上线通讯Linux&Mac_内网安全-隧道技术_ssh_dns_icmp_smb_上线通讯linux_mac-CSDN博客 内网渗透—隧道技术_隧道技术csdn-CSDN博客 #SMB 隧道&通讯&上线 判断&#xff1a;445 通讯 上…

光伏设备制造5G智能工厂数字孪生可视化平台,推进行业数字化转型

光伏设备制造5G智能工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。光伏设备制造5G智能工厂数字孪生可视化平台是光伏行业数字化转型的重要一环。通过数字孪生平台&#xff0c;光伏设备制造企业可以实现对生产过程的全面监控和智能管理&#xff0c;提高生产效率&#…

人工智能|推荐系统——工业界的推荐系统之涨指标

一、推荐系统的评价指标 涨指标的方法有哪些&#xff1f; 二、涨指标的方法&#xff1a;召回 2.1 改进双塔模型 2.2 Item-to-Item (I2I) 2.3 类似I2I 的模型 2.4 总结&#xff1a;改进召回模型 三、涨指标的方法&#xff1a;排序模型 3.1 精排模型的改进 3.2 粗排模型的改进 3…

宝塔面板如何删除一个站点

我们一般的网站都是PHPMySQL开发的&#xff0c;所以删除站点&#xff0c;就要先删数据库&#xff0c;再删网站目录 注意&#xff1a;一点要确保无用的再删 删除站点目录

第十二届蓝桥杯省赛真题 Java 研究生 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 卡片试题 B: 相乘试题 C: 直线试题 D: 路径试题 E : \mathrm{E}: E: 回路计数试题 F: 时间显示试题 G: 最少砝码试题 H : \mathrm{H}: H: 杨辉三角形试题 I: 双向排序试题 J:分果果 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&…

远动通讯屏,组成和功能介绍

远动通讯屏&#xff0c;组成和功能介绍 远动通讯屏是基于电网安全建设而投入的远方监控厂站信息、远方切除电网负荷的设备&#xff1b;主经是由远动装置、通讯管理机、交换机、GPS对时装置、数字通道防雷器、模拟通道防雷器、屏柜及附件等设备组成。变电站远动通讯系统是指对广…

Middle for Mac:简洁高效的文本编辑软件

追求简洁与高效&#xff1f;Middle for Mac将是您文本编辑的最佳选择。这款Mac平台上的文本编辑器&#xff0c;以其独特的魅力和实用的功能&#xff0c;赢得了众多用户的喜爱。 Middle注重用户体验&#xff0c;采用简洁直观的界面设计&#xff0c;让您能够迅速上手并享受高效的…

如何减少冗长变量声明的代码行数

减少冗长变量声明的代码行数有几种方法&#xff0c;具体取决于编程语言和上下文。以下是一些常见的技巧&#xff1a; 问题背景 在编写代码时&#xff0c;经常需要定义许多变量和参数。如果这些变量和参数过多&#xff0c;会导致代码行数增加&#xff0c;可读性降低。例如&…

Metes and Bounds Pro for Mac 激活版:精准数据转换与绘图利器

Metes and Bounds Pro for Mac是一款专为土地测量和边界划定而设计的专业软件&#xff0c;为Mac用户提供了高效、精确的测量工具。其核心功能在于其全面的测量工具和简便的操作流程&#xff0c;能够满足在土地管理、房地产开发、农业规划等领域的多样化需求。 这款软件集合了距…

Java转Kotlin

Kotlin 是一种静态编程语言 2011JetBrains开始开发Kotlin&#xff0c;用于多平台应用&#xff08;能脱离虚拟机&#xff0c;直接编译成可以在win,mac,linux运行的二进制代码&#xff09; 2017获得谷歌官方支持 语法简洁&#xff08;减少了大量的样板代码&#xff0c;语法糖&…

RS3236-3.3YF5 封装SOT-23-5 线性稳压器 带过温保护

RS3236-3.3YF5 是一款由Runic&#xff08;润石&#xff09;公司生产的线性稳压器&#xff08;LDO&#xff09;&#xff0c;以下是该器件的一些功能和参数介绍&#xff1a; 品牌: Runic 产品类型: 线性稳压器 (LDO) 输入电压范围: 最大 7.5V 输出电压: 固定 3.3V 输出电流: 最大…

系分-历年论文题目

年份试题一试题二试题三试题四2023年信息系统数据转换与迁移敏捷开发方法论Devops及其应用论信息系统可行性分析2022年论原型法及其在信息系统开发中的应用论面向对象设计方法及其应用2021年论面向对象的信息系统分析方法论静态测试方法及其应用论富互联网应用的客户端开发技术…

机器学习-12-sklearn案例03-flask对外提供服务

整体思路 训练一个模型&#xff0c;把模型保存 写一个基于flask的web服务&#xff0c;在web运行时加载模型&#xff0c;并在对应的接口调用模型进行预测并返回 使用curl进行测试&#xff0c;测试通过 再创建一个html页面&#xff0c;接受参数输入&#xff0c;并返回。 目录结…