Android(安卓)FTP客户端使用,快速上传文件
16lz
2021-12-04
1.ftp依赖
看Android版本使用
compile 'commons-net:commons-net:3.5'
implementation 'commons-net:commons-net:3.5'
2.废话不多说,直接先上写的一个工具类
public class FTPUtils { private static final String TAG = "FTPClientFunctions"; private FTPClient ftpClient = null; // FTP客户端 SharedPreferences preferences = XLApplication.getContext().getSharedPreferences("setting", Context.MODE_PRIVATE); private String ip; private String port; private String username; private String password; /** * 连接到FTP服务器 * * @return 是否连接成功 */ public boolean ftpConnect(Context context) { try { username = "anonymous"; password = "https://blog.csdn.net"; ip = preferences.getString("ftp_ip", XLApplication.getContext().getString(R.string.access_ip)); port = preferences.getString("ftp_port", XLApplication.getContext().getString(R.string.ftp_port)); ftpClient = new FTPClient(); Log.e(TAG, "connecting to the ftp server " + ip + " :" + port); ftpClient.connect(ip, Integer.parseInt(port)); // 根据返回的状态码,判断链接是否建立成功 if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { Log.e(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.e(TAG, "Error: could not connect to host " + ip); //此处应有提示 //ToastUtil.show((PostAlarmActivity)context,"FTP服务器连接失败"); } 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 文件名称 * @return 文件上传结果 */ public boolean ftpUpload(String srcFilePath, String desFileName) { 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; }}
经过自己的多次调试终于调通了,那么我在这里主要给大家说几个坑吧,可能大家在调试也会出现的情况
1.IP和端口就不说了,根据自己的工程进行修改就行了,那么重点就要说下这个用户名和密码的问题了,刚开是和FTP搭建的人员调试的时候,说的是没有用户名和密码,所以开始我就没有传这两个字段,但是老是调试不通,通过查资料才确定ftp是有默认用户名的anonymous,所以在没有用户名和密码的时候请用默认用户名,然后就是密码也必须随便填一个,不能传空字符,不然可能还是不会通。
3.调用代码
new Thread(new Runnable() { @Override public void run() { // TODO 可以首先去判断一下网络 FTPUtils ftpClient = new FTPUtils(); boolean connectResult = ftpClient.ftpConnect(PostAlarmActivity.this); if (connectResult) { boolean uploadResult = ftpClient.ftpUpload(url, VIDEO_UPLOAD_FILE + name); if (uploadResult) { Log.w(TAG, "上传成功"); boolean disConnectResult = ftpClient.ftpDisconnect(); if (disConnectResult) { Log.e(TAG, "关闭ftp连接成功"); runOnUiThread(new Runnable() { @Override public void run() { submit(url, name, 1); } }); } else { Log.e(TAG, "关闭ftp连接失败"); } } else { Log.w(TAG, "上传失败"); runOnUiThread(new Runnable() { @Override public void run() { ToastUtil.show(PostAlarmActivity.this, "视频上传失败"); } }); } } else { Log.w(TAG, "连接ftp服务器失败"); } } }).start();
public static final String VIDEO_UPLOAD_FILE = "./";
这里的url就是文件源文件路劲,然后这个调用这里也有一个坑,就是这个文件名称是指你要上传的位置,这里前面必须指定上传的文件目录加上你要保存的文件名,"./"表示根目录,name是文件名,如果要上传指定目录,只要确保FTP服务器有就OK了。
更多相关文章
- 如何消除原生Android原生网络连接显示x或者惊叹号
- Android(安卓)SDK 在线更新镜像服务器资源
- Android(安卓)SDK 在线更新镜像服务器资源
- Android网络连接处理
- Android连接SQLite数据库
- Android(安卓)Android使用JSON与服务器交互
- android之调用webservice 实现图片上传
- android、ios与服务器端php使用rsa加密解密通讯
- Android客户端向服务器端发送数据的流程(1)