FTP之二

  1. username=admin
  2. password=123
  3. ip=192.168.14.117
  4. port=21

参考:http://blog.csdn.net/yelove1990/article/details/41245039
实现类

    1. package com.util;
    2. import java.io.*;
    3. import java.net.SocketException;
    4. import java.text.SimpleDateFormat;
    5. import java.util.ArrayList;
    6. import java.util.List;
    7. import java.util.Properties;
    8. import org.apache.commons.logging.Log;
    9. import org.apache.commons.logging.LogFactory;
    10. import org.apache.commons.net.ftp.FTP;
    11. import org.apache.commons.net.ftp.FTPClient;
    12. import org.apache.commons.net.ftp.FTPClientConfig;
    13. import org.apache.commons.net.ftp.FTPFile;
    14. import org.apache.commons.net.ftp.FTPReply;
    15. public class FTPClientTest {
    16. private static final Log logger = LogFactory.getLog(FTPClientTest.class);
    17. private String userName;         //FTP 登录用户名
    18. private String password;         //FTP 登录密码
    19. private String ip;                     //FTP 服务器地址IP地址
    20. private int port;                        //FTP 端口
    21. private Properties property = null;    //属性集
    22. private String configFile = "conf/application.properties";    //配置文件的路径名
    23. private FTPClient ftpClient = null; //FTP 客户端代理
    24. //时间格式化
    25. private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
    26. //FTP状态码
    27. public int i = 1;
    28. /**
    29. * 连接到服务器
    30. *
    31. * @return true 连接服务器成功,false 连接服务器失败
    32. */
    33. public boolean connectServer() {
    34. boolean flag = true;
    35. if (ftpClient == null) {
    36. int reply;
    37. try {
    38. if(setArg(configFile)){
    39. ftpClient = new FTPClient();
    40. ftpClient.setControlEncoding("GBK");
    41. //ftpClient.configure(getFtpConfig());
    42. ftpClient.connect(ip,port);
    43. ftpClient.login(userName, password);
    44. reply = ftpClient.getReplyCode();
    45. ftpClient.setDataTimeout(120000);
    46. if (!FTPReply.isPositiveCompletion(reply)) {
    47. ftpClient.disconnect();
    48. logger.debug("FTP 服务拒绝连接!");
    49. flag = false;
    50. }
    51. i++;
    52. }else{
    53. flag = false;
    54. }
    55. } catch (SocketException e) {
    56. flag = false;
    57. e.printStackTrace();
    58. logger.debug("登录ftp服务器 " + ip + " 失败,连接超时!");
    59. } catch (IOException e) {
    60. flag = false;
    61. e.printStackTrace();
    62. logger.debug("登录ftp服务器 " + ip + " 失败,FTP服务器无法打开!");
    63. }
    64. }
    65. return flag;
    66. }
    67. /**
    68. * 上传文件
    69. *
    70. * @param remoteFile
    71. *            远程文件路径,支持多级目录嵌套
    72. * @param localFile
    73. *            本地文件名称,绝对路径
    74. *
    75. */
    76. public boolean uploadFile(String remoteFile, File localFile)
    77. throws IOException {
    78. boolean flag = false;
    79. InputStream in = new FileInputStream(localFile);
    80. String remote = new String(remoteFile.getBytes("GBK"),"iso-8859-1");
    81. if(ftpClient.storeFile(remote, in)){
    82. flag = true;
    83. logger.debug(localFile.getAbsolutePath()+"上传文件成功!");
    84. }else{
    85. logger.debug(localFile.getAbsolutePath()+"上传文件失败!");
    86. }
    87. in.close();
    88. return flag;
    89. }
    90. /**
    91. * 上传单个文件,并重命名
    92. *
    93. * @param localFile--本地文件路径
    94. * @param localRootFile--本地文件父文件夹路径
    95. * @param distFolder--新的文件名,可以命名为空""
    96. * @return true 上传成功,false 上传失败
    97. * @throws IOException
    98. */
    99. public boolean uploadFile(String local, String remote) throws IOException {
    100. boolean flag = true;
    101. String remoteFileName = remote;
    102. if (remote.contains("/")) {
    103. remoteFileName = remote.substring(remote.lastIndexOf("/") + 1);
    104. // 创建服务器远程目录结构,创建失败直接返回
    105. if (!CreateDirecroty(remote)) {
    106. return false;
    107. }
    108. }
    109. FTPFile[] files = ftpClient.listFiles(new String(remoteFileName));
    110. File f = new File(local);
    111. if(!uploadFile(remoteFileName, f)){
    112. flag = false;
    113. }
    114. return flag;
    115. }
    116. /**
    117. * 上传文件夹内的所有文件
    118. *
    119. *
    120. * @param filename
    121. *       本地文件夹绝对路径
    122. * @param uploadpath
    123. *       上传到FTP的路径,形式为/或/dir1/dir2/../
    124. * @return true 上传成功,false 上传失败
    125. * @throws IOException
    126. */
    127. public List uploadManyFile(String filename, String uploadpath) {
    128. boolean flag = true;
    129. List l = new ArrayList();
    130. StringBuffer strBuf = new StringBuffer();
    131. int n = 0; //上传失败的文件个数
    132. int m = 0; //上传成功的文件个数
    133. try {
    134. ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    135. ftpClient.enterLocalPassiveMode();
    136. ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
    137. ftpClient.changeWorkingDirectory("/");
    138. File file = new File(filename);
    139. File fileList[] = file.listFiles();
    140. for (File upfile : fileList) {
    141. if (upfile.isDirectory()) {
    142. uploadManyFile(upfile.getAbsoluteFile().toString(),uploadpath);
    143. } else {
    144. String local = upfile.getCanonicalPath().replaceAll("\\\\","/");
    145. String remote = uploadpath.replaceAll("\\\\","/") + local.substring(local.indexOf("/") + 1);
    146. flag = uploadFile(local, remote);
    147. ftpClient.changeWorkingDirectory("/");
    148. }
    149. if (!flag) {
    150. n++;
    151. strBuf.append(upfile.getName() + ",");
    152. logger.debug("文件[" + upfile.getName() + "]上传失败");
    153. } else{
    154. m++;
    155. }
    156. }
    157. l.add(0, n);
    158. l.add(1, m);
    159. l.add(2, strBuf.toString());
    160. } catch (NullPointerException e) {
    161. e.printStackTrace();
    162. logger.debug("本地文件上传失败!找不到上传文件!", e);
    163. } catch (Exception e) {
    164. e.printStackTrace();
    165. logger.debug("本地文件上传失败!", e);
    166. }
    167. return l;
    168. }
    169. /**
    170. * 下载文件
    171. *
    172. * @param remoteFileName             --服务器上的文件名
    173. * @param localFileName--本地文件名
    174. * @return true 下载成功,false 下载失败
    175. */
    176. public boolean loadFile(String remoteFileName, String localFileName) {
    177. boolean flag = true;
    178. // 下载文件
    179. BufferedOutputStream buffOut = null;
    180. try {
    181. buffOut = new BufferedOutputStream(new FileOutputStream(localFileName));
    182. flag = ftpClient.retrieveFile(remoteFileName, buffOut);
    183. } catch (Exception e) {
    184. e.printStackTrace();
    185. logger.debug("本地文件下载失败!", e);
    186. } finally {
    187. try {
    188. if (buffOut != null)
    189. buffOut.close();
    190. } catch (Exception e) {
    191. e.printStackTrace();
    192. }
    193. }
    194. return flag;
    195. }
    196. /**
    197. * 删除一个文件
    198. */
    199. public boolean deleteFile(String filename) {
    200. boolean flag = true;
    201. try {
    202. flag = ftpClient.deleteFile(filename);
    203. if (flag) {
    204. logger.debug("删除文件"+filename+"成功!");
    205. } else {
    206. logger.debug("删除文件"+filename+"成功!");
    207. }
    208. } catch (IOException ioe) {
    209. ioe.printStackTrace();
    210. }
    211. return flag;
    212. }
    213. /**
    214. * 删除目录
    215. */
    216. public void deleteDirectory(String pathname) {
    217. try {
    218. File file = new File(pathname);
    219. if (file.isDirectory()) {
    220. File file2[] = file.listFiles();
    221. } else {
    222. deleteFile(pathname);
    223. }
    224. ftpClient.removeDirectory(pathname);
    225. } catch (IOException ioe) {
    226. ioe.printStackTrace();
    227. }
    228. }
    229. /**
    230. * 删除空目录
    231. */
    232. public void deleteEmptyDirectory(String pathname) {
    233. try {
    234. ftpClient.removeDirectory(pathname);
    235. } catch (IOException ioe) {
    236. ioe.printStackTrace();
    237. }
    238. }
    239. /**
    240. * 列出服务器上文件和目录
    241. *
    242. * @param regStr --匹配的正则表达式
    243. */
    244. public void listRemoteFiles(String regStr) {
    245. try {
    246. String files[] = ftpClient.listNames(regStr);
    247. if (files == null || files.length == 0)
    248. logger.debug("没有任何文件!");
    249. else {
    250. for (int i = 0; i < files.length; i++) {
    251. System.out.println(files[i]);
    252. }
    253. }
    254. } catch (Exception e) {
    255. e.printStackTrace();
    256. }
    257. }
    258. /**
    259. * 列出Ftp服务器上的所有文件和目录
    260. */
    261. public void listRemoteAllFiles() {
    262. try {
    263. String[] names = ftpClient.listNames();
    264. for (int i = 0; i < names.length; i++) {
    265. System.out.println(names[i]);
    266. }
    267. } catch (Exception e) {
    268. e.printStackTrace();
    269. }
    270. }
    271. /**
    272. * 关闭连接
    273. */
    274. public void closeConnect() {
    275. try {
    276. if (ftpClient != null) {
    277. ftpClient.logout();
    278. ftpClient.disconnect();
    279. }
    280. } catch (Exception e) {
    281. e.printStackTrace();
    282. }
    283. }
    284. /**
    285. * 设置传输文件的类型[文本文件或者二进制文件]
    286. *
    287. * @param fileType--BINARY_FILE_TYPE、ASCII_FILE_TYPE
    288. *
    289. */
    290. public void setFileType(int fileType) {
    291. try {
    292. ftpClient.setFileType(fileType);
    293. } catch (Exception e) {
    294. e.printStackTrace();
    295. }
    296. }
    297. /**
    298. * 设置参数
    299. *
    300. * @param configFile --参数的配置文件
    301. */
    302. private boolean setArg(String configFile) {
    303. boolean flag = true;
    304. property = new Properties();
    305. BufferedInputStream inBuff = null;
    306. try {
    307. inBuff = new BufferedInputStream(new FileInputStream(getClass().getResource("/").getPath() + configFile));
    308. property.load(inBuff);
    309. userName = property.getProperty("username");
    310. password = property.getProperty("password");
    311. ip = property.getProperty("ip");
    312. port = Integer.parseInt(property.getProperty("port"));
    313. } catch (FileNotFoundException e1) {
    314. flag = false;
    315. logger.debug("配置文件 " + configFile + " 不存在!");
    316. } catch (IOException e) {
    317. flag = false;
    318. logger.debug("配置文件 " + configFile + " 无法读取!");
    319. }
    320. return flag;
    321. }
    322. /**
    323. * 进入到服务器的某个目录下
    324. *
    325. * @param directory
    326. */
    327. public boolean changeWorkingDirectory(String directory) {
    328. boolean flag = true;
    329. try {
    330. flag = ftpClient.changeWorkingDirectory(directory);
    331. if (flag) {
    332. logger.debug("进入文件夹"+ directory + " 成功!");
    333. } else {
    334. logger.debug("进入文件夹"+ directory + " 失败!");
    335. }
    336. } catch (IOException ioe) {
    337. ioe.printStackTrace();
    338. }
    339. return flag;
    340. }
    341. /**
    342. * 返回到上一层目录
    343. */
    344. public void changeToParentDirectory() {
    345. try {
    346. ftpClient.changeToParentDirectory();
    347. } catch (IOException ioe) {
    348. ioe.printStackTrace();
    349. }
    350. }
    351. /**
    352. * 重命名文件
    353. *
    354. * @param oldFileName --原文件名
    355. * @param newFileName --新文件名
    356. */
    357. public void renameFile(String oldFileName, String newFileName) {
    358. try {
    359. ftpClient.rename(oldFileName, newFileName);
    360. } catch (IOException ioe) {
    361. ioe.printStackTrace();
    362. }
    363. }
    364. /**
    365. * 设置FTP客服端的配置--一般可以不设置
    366. *
    367. * @return ftpConfig
    368. */
    369. private FTPClientConfig getFtpConfig() {
    370. FTPClientConfig ftpConfig = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
    371. ftpConfig.setServerLanguageCode(FTP.DEFAULT_CONTROL_ENCODING);
    372. return ftpConfig;
    373. }
    374. /**
    375. * 转码[ISO-8859-1 -> GBK] 不同的平台需要不同的转码
    376. *
    377. * @param obj
    378. * @return ""
    379. */
    380. private String iso8859togbk(Object obj) {
    381. try {
    382. if (obj == null)
    383. return "";
    384. else
    385. return new String(obj.toString().getBytes("iso-8859-1"), "GBK");
    386. } catch (Exception e) {
    387. return "";
    388. }
    389. }
    390. /**
    391. * 在服务器上创建一个文件夹
    392. *
    393. * @param dir 文件夹名称,不能含有特殊字符,如 \ 、/ 、: 、* 、?、 "、 <、>...
    394. */
    395. public boolean makeDirectory(String dir) {
    396. boolean flag = true;
    397. try {
    398. flag = ftpClient.makeDirectory(dir);
    399. if (flag) {
    400. logger.debug("创建文件夹"+ dir + " 成功!");
    401. } else {
    402. logger.debug("创建文件夹"+ dir + " 失败!");
    403. }
    404. } catch (Exception e) {
    405. e.printStackTrace();
    406. }
    407. return flag;
    408. }
    409. // 检查路径是否存在,存在返回true,否则false
    410. public boolean existFile(String path) throws IOException {
    411. boolean flag = false;
    412. FTPFile[] ftpFileArr = ftpClient.listFiles(path);
    413. /* for (FTPFile ftpFile : ftpFileArr) {
    414. if (ftpFile.isDirectory()
    415. && ftpFile.getName().equalsIgnoreCase(path)) {
    416. flag = true;
    417. break;
    418. }
    419. } */
    420. if(ftpFileArr.length > 0){
    421. flag = true;
    422. }
    423. return flag;
    424. }
    425. /**
    426. * 递归创建远程服务器目录
    427. *
    428. * @param remote
    429. *            远程服务器文件绝对路径
    430. *
    431. * @return 目录创建是否成功
    432. * @throws IOException
    433. */
    434. public boolean CreateDirecroty(String remote) throws IOException {
    435. boolean success = true;
    436. String directory = remote.substring(0, remote.lastIndexOf("/") + 1);
    437. // 如果远程目录不存在,则递归创建远程服务器目录
    438. if (!directory.equalsIgnoreCase("/")&& !changeWorkingDirectory(new String(directory))) {
    439. int start = 0;
    440. int end = 0;
    441. if (directory.startsWith("/")) {
    442. start = 1;
    443. } else {
    444. start = 0;
    445. }
    446. end = directory.indexOf("/", start);
    447. while (true) {
    448. String subDirectory = new String(remote.substring(start, end).getBytes("GBK"),"iso-8859-1");
    449. if (changeWorkingDirectory(subDirectory)) {
    450. if (makeDirectory(subDirectory)) {
    451. changeWorkingDirectory(subDirectory);
    452. } else {
    453. logger.debug("创建目录["+subDirectory+"]失败");
    454. System.out.println("创建目录["+subDirectory+"]失败");
    455. success = false;
    456. return success;
    457. }
    458. }
    459. start = end + 1;
    460. end = directory.indexOf("/", start);
    461. // 检查所有目录是否创建完毕
    462. if (end <= start) {
    463. break;
    464. }
    465. }
    466. }
    467. return success;
    468. }
    469. public static void main(String[] args) {
    470. FTPClientTest ftpClient = new FTPClientTest();
    471. if(ftpClient.connectServer()){
    472. ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 设置传输二进制文件
    473. ftpClient.uploadManyFile("H:\\d", "/d/");
    474. ftpClient.closeConnect();// 关闭连接
    475. }
    476. }
    477. }
上一篇:WPF 用 DataTemplate 合并DataGrid列表列头<类似报表设计>及行头列头样式 - 学习


下一篇:srand() rand() time(0)