博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 上传文件到 FTP 服务器
阅读量:5130 次
发布时间:2019-06-13

本文共 4489 字,大约阅读时间需要 14 分钟。

实现背景

近期接触到一个需求,就是将文件从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/

转载于:https://www.cnblogs.com/renhui/p/7732143.html

你可能感兴趣的文章
C# 无损图片压缩—— 基于Framework.40 类库实现
查看>>
opencv2函数学习之erode、dilate:图像腐蚀和膨胀
查看>>
OkHttp下载文件中途断网报Can't create handler inside thread that has not called Looper.prepare()异常的解决办法...
查看>>
ASP.NET五步打包下载Zip文件
查看>>
android的style控制Theme
查看>>
Common xaml controls(补交作业)
查看>>
tensorflow函数解析:Session.run和Tensor.eval的区别
查看>>
Ext.Ajax.request 与formPanel.getForm().submit() success的区别
查看>>
基于 select2 插件的自做效果
查看>>
mv命令
查看>>
mysql读写分离
查看>>
webRTC源码下载 Windows Mac(iOS) Linux(Android)全
查看>>
函数和方法的区别
查看>>
树剖想法题——BZOJ3626
查看>>
master
查看>>
Duilib使用wke显示echarts
查看>>
linux lsof用法
查看>>
windows(64位)下使用curl命令
查看>>
杭电2093
查看>>
字符串 “ ” 的方法
查看>>