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服务管理器了,安装过程可能需要等待几分钟。
java实战3:用java实现数据文件上传到ftp服务器_第1张图片
2:回到电脑桌面,右击“计算机”,点击 管理,进入计算机管理界面。在这里,我们就可以看到刚刚添加的IIS服务,接下来的操作就像我们在VPS主机上添加网站差不多的操作步骤了。选中IIS服务——》网站——》右键添加FTP站点
java实战3:用java实现数据文件上传到ftp服务器_第2张图片
java实战3:用java实现数据文件上传到ftp服务器_第3张图片

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

3:用java开发连接ftp

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

     
                commons-io
                commons-io
                2.5
    

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);
    }

你可能感兴趣的:(Java专栏,服务器,java,网络)