我是靠谱客的博主 平淡大白,这篇文章主要介绍Android使用ftp方式实现文件上传和下载功能,现在分享给大家,希望可以做个参考。

近期在工作上一直再维护平台OTA在线升级项目,其中关于这个升级文件主要是存放于ftp服务器上的,然后客户端通过走ftp协议方式下载至本地Android机进行一个系统升级操作。那么今天将对ftp实现文件上传和下载进行一个使用总结,关于ftp这方面的理论知识如果不是太了解的各位道友,那么请移步HTTP和FTP的区别的一些理论知识 作个具体的了解或者查阅相关资料。那么先看看个人工作项目这个OTA升级效果图吧。如下:

下面是具体的接口实现:

那么相关ftp的操作,已经被封装到ota.ftp这个包下,各位童鞋可以下载示例代码慢慢研究。另外这个要是用ftp服务我们cline端需要再项目工程导入ftp4j-1.7.2.jar包

这边作个使用的逻辑分析:首先在我们的项目工程FtpApplication中启动这个OtaService,其中OtaService作为一个服务运行起来,在这个服务里面拿到封装好ftp相关接口的DownLoad.java进行ftp文件操作,关键代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void startDownload() { // TODO Auto-generated method stub mDownLoad.start(); } public void stopDownload() { mDownLoad.stop(); } public void cancel() { mDownLoad.cancel(); } public String getOldDate() { return mDownLoad.getDatabaseOldDate(); } public String getOldVersion() { return mDownLoad.getDatabaseOldVersion(); } public void checkVer(String serverRoot) { // TODO Auto-generated method stub mDownLoad = DownLoad.getInstance(); mDownLoad.setServeRoot(serverRoot); mDownLoad.setFtpInfo(mApp.mFtpInfo); mDownLoad.checkUpgrade(); }

FTPToolkit.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
package com.asir.ota.ftp; import it.sauronsoftware.ftp4j.FTPClient; import it.sauronsoftware.ftp4j.FTPFile; import java.io.File; import java.util.List; import com.asir.ota.clinet.PathToolkit; import com.asir.ota.ftp.DownLoad.MyFtpListener; /** * FTP客户端工具 * */ public final class FTPToolkit { private FTPToolkit() { } /** * 创建FTP连接 * * @param host * 主机名或IP * @param port * ftp端口 * @param username * ftp用户名 * @param password * ftp密码 * @return 一个客户端 * @throws Exception */ public static FTPClient makeFtpConnection(String host, int port, String username, String password) throws Exception { FTPClient client = new FTPClient(); try { client.connect(host, port); if(username != null && password != null) { client.login(username, password); } } catch (Exception e) { throw new Exception(e); } return client; } /** * FTP下载文件到本地一个文件夹,如果本地文件夹不存在,则创建必要的目录结构 * * @param client * FTP客户端 * @param remoteFileName * FTP文件 * @param localPath * 存的本地文件路径或目录 * @throws Exception */ public static void download(FTPClient client, String remoteFileName, String localPath, long startPoint, MyFtpListener listener) throws Exception { String localfilepath = localPath; int x = isExist(client, remoteFileName); File localFile = new File(localPath); if (localFile.isDirectory()) { if (!localFile.exists()) localFile.mkdirs(); localfilepath = PathToolkit.formatPath4File(localPath + File.separator + new File(remoteFileName).getName()); } if (x == FTPFile.TYPE_FILE) { try { if (listener != null) client.download(remoteFileName, new File(localfilepath), startPoint, listener); else client.download(remoteFileName, new File(localfilepath), startPoint); } catch (Exception e) { throw new Exception(e); } } else { throw new Exception("the target " + remoteFileName + "not exist"); } } /** * FTP上传本地文件到FTP的一个目录下 * * @param client * FTP客户端 * @param localfile * 本地文件 * @param remoteFolderPath * FTP上传目录 * @throws Exception */ public static void upload(FTPClient client, File localfile, String remoteFolderPath, MyFtpListener listener) throws Exception { remoteFolderPath = PathToolkit.formatPath4FTP(remoteFolderPath); try { client.changeDirectory(remoteFolderPath); if (!localfile.exists()) throw new Exception("the upload FTP file" + localfile.getPath() + "not exist!"); if (!localfile.isFile()) throw new Exception("the upload FTP file" + localfile.getPath() + "is a folder!"); if (listener != null) client.upload(localfile, listener); else client.upload(localfile); client.changeDirectory("/"); } catch (Exception e) { throw new Exception(e); } } /** * FTP上传本地文件到FTP的一个目录下 * * @param client * FTP客户端 * @param localfilepath * 本地文件路径 * @param remoteFolderPath * FTP上传目录 * @throws Exception */ public static void upload(FTPClient client, String localfilepath, String remoteFolderPath, MyFtpListener listener) throws Exception { File localfile = new File(localfilepath); upload(client, localfile, remoteFolderPath, listener); } /** * 批量上传本地文件到FTP指定目录上 * * @param client * FTP客户端 * @param localFilePaths * 本地文件路径列表 * @param remoteFolderPath * FTP上传目录 * @throws Exception */ public static void uploadListPath(FTPClient client, List<String> localFilePaths, String remoteFolderPath, MyFtpListener listener) throws Exception { remoteFolderPath = PathToolkit.formatPath4FTP(remoteFolderPath); try { client.changeDirectory(remoteFolderPath); for (String path : localFilePaths) { File file = new File(path); if (!file.exists()) throw new Exception("the upload FTP file" + path + "not exist!"); if (!file.isFile()) throw new Exception("the upload FTP file" + path + "is a folder!"); if (listener != null) client.upload(file, listener); else client.upload(file); } client.changeDirectory("/"); } catch (Exception e) { throw new Exception(e); } } /** * 批量上传本地文件到FTP指定目录上 * * @param client * FTP客户端 * @param localFiles * 本地文件列表 * @param remoteFolderPath * FTP上传目录 * @throws Exception */ public static void uploadListFile(FTPClient client, List<File> localFiles, String remoteFolderPath, MyFtpListener listener) throws Exception { try { client.changeDirectory(remoteFolderPath); remoteFolderPath = PathToolkit.formatPath4FTP(remoteFolderPath); for (File file : localFiles) { if (!file.exists()) throw new Exception("the upload FTP file" + file.getPath() + "not exist!"); if (!file.isFile()) throw new Exception("the upload FTP file" + file.getPath() + "is a folder!"); if (listener != null) client.upload(file, listener); else client.upload(file); } client.changeDirectory("/"); } catch (Exception e) { throw new Exception(e); } } /** * 判断一个FTP路径是否存在,如果存在返回类型(FTPFile.TYPE_DIRECTORY=1、FTPFile.TYPE_FILE=0、 * FTPFile.TYPE_LINK=2) 如果文件不存在,则返回一个-1 * * @param client * FTP客户端 * @param remotePath * FTP文件或文件夹路径 * @return 存在时候返回类型值(文件0,文件夹1,连接2),不存在则返回-1 */ public static int isExist(FTPClient client, String remotePath) { remotePath = PathToolkit.formatPath4FTP(remotePath); FTPFile[] list = null; try { list = client.list(remotePath); } catch (Exception e) { return -1; } if (list.length > 1) return FTPFile.TYPE_DIRECTORY; else if (list.length == 1) { FTPFile f = list[0]; if (f.getType() == FTPFile.TYPE_DIRECTORY) return FTPFile.TYPE_DIRECTORY; // 假设推理判断 String _path = remotePath + "/" + f.getName(); try { int y = client.list(_path).length; if (y == 1) return FTPFile.TYPE_DIRECTORY; else return FTPFile.TYPE_FILE; } catch (Exception e) { return FTPFile.TYPE_FILE; } } else { try { client.changeDirectory(remotePath); return FTPFile.TYPE_DIRECTORY; } catch (Exception e) { return -1; } } } public static long getFileLength(FTPClient client, String remotePath) throws Exception { String remoteFormatPath = PathToolkit.formatPath4FTP(remotePath); if(isExist(client, remotePath) == 0) { FTPFile[] files = client.list(remoteFormatPath); return files[0].getSize(); }else { throw new Exception("get remote file length error!"); } } /** * 关闭FTP连接,关闭时候像服务器发送一条关闭命令 * * @param client * FTP客户端 * @return 关闭成功,或者链接已断开,或者链接为null时候返回true,通过两次关闭都失败时候返回false */ public static boolean closeConnection(FTPClient client) { if (client == null) return true; if (client.isConnected()) { try { client.disconnect(true); return true; } catch (Exception e) { try { client.disconnect(false); } catch (Exception e1) { e1.printStackTrace(); return false; } } } return true; } }

包括登录,开始下载,取消下载,获取升级文件版本号和服务器版本校验等。其它的是一些数据库,SD卡文件相关操作,那么最后在我们下载完成之后需要对文件进行一个文件解压再执行升级操作,这部分在ZipExtractor.java和OTAProvider.java中实现

示例代码点击下载

总结

到此这篇关于Android使用ftp方式实现文件上传和下载的文章就介绍到这了,更多相关android ftp文件上传下载内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!

最后

以上就是平淡大白最近收集整理的关于Android使用ftp方式实现文件上传和下载功能的全部内容,更多相关Android使用ftp方式实现文件上传和下载功能内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(146)

评论列表共有 0 条评论

立即
投稿
返回
顶部