zoukankan      html  css  js  c++  java
  • Android 上传文件到 FTP 服务器

    实现背景

    近期接触到一个需求,就是将文件从Android系统上传到FTP服务器,虽然之前接触过FTP服务器,了解基本的使用流程,但是将此流程从使用习惯转化为代码实现还是有一定难度的。但是基本的流程还是比较清楚的:

    • 1.在Android手机上创建一个FTP客户端
    • 2.设置host及端口建立与FTP服务器的连接
    • 3.使用用户名和密码登录FTP服务器
    • 4.更改目录,将当前客户端指向的服务端的文件夹从跟目录调整到指定的目录
    • 5.上传文件,并等待上传完成的结果
    • 6.断开和FTP服务器的链接

    代码实现

    1.创建FTP客户端并定义相关的操作流程

    public class FTPClientFunctions {
    
        private static final String TAG = "FTPClientFunctions";
    
        private FTPClient ftpClient = null; // FTP客户端
    
        /**
         * 连接到FTP服务器
         *
         * @param host     ftp服务器域名
         * @param username 访问用户名
         * @param password 访问密码
         * @param port     端口
         * @return 是否连接成功
         */
        public boolean ftpConnect(String host, String username, String password, int port) {
            try {
                ftpClient = new FTPClient();
                Log.d(TAG, "connecting to the ftp server " + host + " :" + port);
                ftpClient.connect(host, port);
                // 根据返回的状态码,判断链接是否建立成功
                if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                    Log.d(TAG, "login to the ftp server");
                    boolean status = ftpClient.login(username, password);
                    /*
                     * 设置文件传输模式
                     * 避免一些可能会出现的问题,在这里必须要设定文件的传输格式。
                     * 在这里我们使用BINARY_FILE_TYPE来传输文本、图像和压缩文件。
                     */
                    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                    ftpClient.enterLocalPassiveMode();
                    return status;
                }
            } catch (Exception e) {
                e.printStackTrace();
                Log.d(TAG, "Error: could not connect to host " + host);
            }
            return false;
        }
    
        /**
         * 断开ftp服务器连接
         *
         * @return 断开结果
         */
        public boolean ftpDisconnect() {
            // 判断空指针
            if (ftpClient == null) {
                return true;
            }
    
            // 断开ftp服务器连接
            try {
                ftpClient.logout();
                ftpClient.disconnect();
                return true;
            } catch (Exception e) {
                Log.d(TAG, "Error occurred while disconnecting from ftp server.");
            }
            return false;
        }
    
        /**
         * ftp 文件上传
         *
         * @param srcFilePath  源文件目录
         * @param desFileName  文件名称
         * @param desDirectory 目标文件
         * @return 文件上传结果
         */
        public boolean ftpUpload(String srcFilePath, String desFileName, String desDirectory) {
            boolean status = false;
            try {
                FileInputStream srcFileStream = new FileInputStream(srcFilePath);
                status = ftpClient.storeFile(desFileName, srcFileStream);
                srcFileStream.close();
                return status;
            } catch (Exception e) {
                e.printStackTrace();
                Log.d(TAG, "upload failed: " + e.getLocalizedMessage());
            }
            return status;
        }
    
        /**
         * ftp 更改目录
         *
         * @param path 更改的路径
         * @return 更改是否成功
         */
        public boolean ftpChangeDir(String path) {
            boolean status = false;
            try {
                status = ftpClient.changeWorkingDirectory(path);
            } catch (Exception e) {
                e.printStackTrace();
                Log.d(TAG, "change directory failed: " + e.getLocalizedMessage());
            }
            return status;
        }
    
    }
    
    

    2.完整的操作流程

    // 网络操作,但开一个线程进行处理
    new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO 可以首先去判断一下网络
            ftpClient = new FTPClientFunctions();
            boolean connectResult = ftpClient.ftpConnect(FTP_SERVER, FTP_USERNAME, FTP_PASSWORD, FTP_PORT);
            if (connectResult) {
                boolean changeDirResult = ftpClient.ftpChangeDir("/**");
                if (changeDirResult) {
                    boolean uploadResult = ftpClient.ftpUpload(sourceFilePath, descFileName, "");
                    if (uploadResult) {
                        Log.w(TAG, "上传成功");
                        boolean disConnectResult = ftpClient.ftpDisconnect();
                        if(disConnectResult) {
                            Log.e(TAG, "关闭ftp连接成功");
                        } else {
                            Log.e(TAG, "关闭ftp连接失败");
                        }
                    } else {
                        Log.w(TAG, "上传失败");
                    }
                } else {
                    Log.w(TAG, "切换ftp目录失败");
                }
    
            } else {
                Log.w(TAG, "连接ftp服务器失败");
            }
        }
    }).start();        
    

    3.FTP交互相关库

    commons-net-3.6.jar : Apache Commons Net 阿帕奇提供的常用的网络交互的jar包。
    支持以下协议:

    • FTP/FTPS
    • FTP over HTTP (experimental)
    • NNTP
    • SMTP(S)
    • POP3(S)
    • IMAP(S)
    • Telnet
    • TFTP
    • Finger
    • Whois
    • rexec/rcmd/rlogin
    • Time (rdate) and Daytime
    • Echo
    • Discard
    • NTP/SNTP

    在这里我们只用的了FTP协议。不得不说,库使用起来还是相当方便的。
    相关链接:http://commons.apache.org/proper/commons-net/

  • 相关阅读:
    csc一些命令简记
    Winform(C#.NET)自动更新组件的使用及部分功能实现(续)
    Winform(C#.NET)自动更新组件的使用及部分功能实现
    mssql的日期函数,如何取得当前年月日,当前时间,当前月份,当前天数,一年中第几天?
    在jexus下如何简单的配置多站点
    让asp.net和php同时在Linux上跑起来
    raspberrypi(树莓派)上安装mono和jexus,运行asp.net程序
    centos6.3与jexus5.4.4配置支持php(wordpress)
    Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类
    小记tensorflow-1:tf.nn.conv2d 函数介绍
  • 原文地址:https://www.cnblogs.com/renhui/p/7732143.html
Copyright © 2011-2022 走看看