IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> java实战3:用java实现数据文件上传到ftp服务器 -> 正文阅读

[网络协议]java实战3:用java实现数据文件上传到ftp服务器

1:ftp简介

文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。
FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。

1.1:工作流程

在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP 协议与操作系统无关,任何操作系统上的程序只要符合 FTP 协议,就可以相互传输数据

1.2:工作模式

FTP支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式)。

1.3:传输方式

FTP的传输有两种方式:ASCII、二进制。

2:windows开启ftp服务

在自己的电脑上可以开启一个ftp服务用于测试。
1:打开控制面板—》程序—》启动或关闭windows功能
找到互联网信息服务勾选?其中的ftp服务器,web管理,万维网服务。
系统就会安装IIS服务管理器了,安装过程可能需要等待几分钟。
在这里插入图片描述
2:回到电脑桌面,右击“计算机”,点击 管理,进入计算机管理界面。在这里,我们就可以看到刚刚添加的IIS服务,接下来的操作就像我们在VPS主机上添加网站差不多的操作步骤了。选中IIS服务——》网站——》右键添加FTP站点
在这里插入图片描述
在这里插入图片描述

3:设置ftp基本信息。路径为远程连接的工作路径
在这里插入图片描述
选取本机的IP地址,SSL如果不涉密可以选无。
在这里插入图片描述
这里权限先这样设置之后再修改,点击完成即可。
在这里插入图片描述
保存后在此后即可看到添加的ftp服务。可以这样开启多个。
在这里插入图片描述
4:注意
要想通过java程序连接FTP在这里我新建了一个FTP的用户,新建一个用户ftptest,密码:123456,如下所示
在这里插入图片描述
这里注意一定要把√取消掉确定完成新建,之后修改FTP服务器设置,添加这个特定用户。
在这里插入图片描述
点击创建的ftp名称—》ftp身份验证—》修改身份认证,禁止匿名身份
在这里插入图片描述
在这里插入图片描述
返回最开始的页面,添加刚才创建的用户,如果创建用户对勾选着可能添加不成功。
在这里插入图片描述
输入刚才新建的用户名和密码,完成
在这里插入图片描述
如何测试刚才新建的用户是否有效嘞有好多种方法常用的是CMD命令行和下面介绍的这种
打开我的电脑在最上面输入
ftp:/+FTP之前设置的IP地址
我的是ftp:/169.254.187.243回车
输入用户和密码即可登录
在这里插入图片描述

3:用java开发连接ftp

org.apache.common.io提供了对FTP的开发,引入以下依赖

     <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.5</version>
    </dependency>

3.1:ftp工具类

连接ftp服务

public class FtpClient {
    private final static Logger LOGGER = LoggerFactory.getLogger(FtpClient.class);
    /**
     * FTP服务地址
     */
    private static String FTP_IP;
    /**
     * FTP端口号
     */
    private static Integer FTP_PORT;
    /**
     * FTP用户名
     */
    private static String FTP_USER;
    /**
     * FTP密码
     */
    private static String FTP_PASSWORD;
    /**
     * FTP根路径
     */
    private static String FTP_PATH;
    /**
     * 映射盘符
     */
    private static String FTP_DRIVELETTER;
    private static FTPClient ftpClient;

    static {
        try {
            Properties properties = new Properties();
            InputStream inputStream = FtpClient.class.getClassLoader().getResourceAsStream("ftp-config.properties");
            properties.load(inputStream);
            FTP_IP = properties.getProperty("FTP_IP");
            FTP_PORT = Integer.valueOf(properties.getProperty("FTP_PORT"));
            FTP_USER = properties.getProperty("FTP_USER");
            FTP_PASSWORD = properties.getProperty("FTP_PASSWORD");
            FTP_PATH = properties.getProperty("FTP_PATH");
            FTP_DRIVELETTER = properties.getProperty("FTP_DRIVELETTER");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static FTPClient getFTPConnection() {
        ftpClient = new FTPClient();
        try {
            //连接
            ftpClient.connect(FtpClient.FTP_IP, FtpClient.FTP_PORT);
            //设置编码
            ftpClient.setControlEncoding("UTF-8");
            //设置传输文件类型
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            //登录
            ftpClient.login(FtpClient.FTP_USER, FtpClient.FTP_PASSWORD);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                LOGGER.info("==============未连接到FTP,用户名或密码错误=================");
                //拒绝连接
                ftpClient.disconnect();
            } else {
                LOGGER.info("==============连接到FTP成功=================");
            }
        } catch (SocketException e) {
            e.printStackTrace();
            LOGGER.info("==============FTP的IP地址错误==============");
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.info("==============FTP的端口错误==============");
        }
        return ftpClient;
    }

    public static void closeConnect() {
        LOGGER.warn("关闭ftp服务器");
        try {
            if (ftpClient != null) {
                ftpClient.logout();
                ftpClient.disconnect();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ftp工具类,进行文件上传下载等操作

public class FTPUtils {
    /**
     * 上传单个文件到远程
     *
     * @param ftpPath        路径
     * @param uploadFileName 文件名
     * @param input          输入流
     * @return
     */
    public static boolean uploadFile(String ftpPath, String uploadFileName, InputStream input) {
        boolean issuccess = false;
        FTPClient ftpClient = null;
        try {
            ftpClient = FtpClient.getFTPConnection();

            //切换到工作目录

            if (!ftpClient.changeWorkingDirectory(ftpPath)) {
                ftpClient.changeWorkingDirectory("/");
                String[] dirs = ftpPath.split("/");
                for (String dir : dirs) {
                    ftpClient.makeDirectory(dir);
                    ftpClient.changeWorkingDirectory(dir);
                }
            }

            ftpClient.enterLocalPassiveMode();//工作模式被动
            //文件写入 远程文件名;输入流
            boolean storeFile = ftpClient.storeFile(uploadFileName, input);
            if (!storeFile) {
                return issuccess;
            }
            input.close();
            ftpClient.logout();
            issuccess = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return issuccess;
    }

    private String inputStreamToString(InputStream inputStream) {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuffer stringBuffer = new StringBuffer();
        String oneLine = "";
        try {
            while ((oneLine = bufferedReader.readLine()) != null) {
                stringBuffer.append(oneLine);
            }
            return stringBuffer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3.2:测试

数据写入成功

    public static void main(String[] args) {
        String str = "test";
        final ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());
        FTPUtils.uploadFile("/remote", "test.txt", inputStream);
    }

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:36:04  更:2021-12-26 22:36:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:42:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码