2019-06-12 22:28:33
感谢:
下面是参考的博客,谢谢以下的博主大佬
https://www.cnblogs.com/yingyujyf/p/6933823.html
https://blog.csdn.net/h_tinkinginjava/article/details/80048043 (我把这位博主代码中的UTF-8改成了GBK好用了,UTF-8上传的时候中文文件名是乱码)
已经是快四年的博客园用户了,今天实在是因为遇到的坑太蛋疼了,所以写好之后想直接发个博客。
一、FTP的配置
FTP配置下面的博主介绍的很清楚了:
https://www.cnblogs.com/2016-10-07/articles/6673074.html
二、FTP练习目录展示
下图是FTP的练习截图:
三、jar包下载
用到了这三个jar包,jar包确实不大好找,下面是我上传的jar包连接:
https://files.cnblogs.com/files/gbn007/FTP%E7%AE%80%E5%8D%95%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E6%89%80%E9%9C%80%E8%A6%81%E7%9A%84jar%E5%8C%85.rar
四、测试目录展示
测试用到的文件展示(FTPDOWN中没有任何文件),图片好大呀,暂时还不会改大小,会改了我再改一下:
员工信息表.txt 下图:
五、代码展示
之后就开始代码发布阶段了:
Main.java:
1 package FTP; 2 3 import java.io.*; 4 5 public class Main { 6 public static void main(String[] args) { 7 String ftpHost = "172.203.160.104"; 8 String ftpUserName = "GBNFTP"; 9 String ftpPassword = "ASDFGHJKL;'"; 10 int ftpPort = 21; 11 String ftpPath = "/FTP/FTPDOWN"; 12 String localPath = "D:\\FTP\\员工信息表.txt";//"D:\\FTP\\upload.txt"; 13 String downloadPath = "D:\\FTP"; 14 String uploadFileName = "员工上传.txt";//"ftp_upload.txt"; 15 String downloadFileName = "员工下载.txt";//"ftp_download.txt"; 16 17 // 上传一个文件 18 try { 19 System.out.println("=============上传文件操作==============="); 20 FileInputStream in = new FileInputStream(new File(localPath)); 21 boolean isUp = FtpUtil.uploadFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, uploadFileName, in); 22 if (isUp) { 23 System.out.println("上传成功 !"); 24 } else { 25 System.out.println("上传失败 !"); 26 } 27 System.out.println("=============下载文件操作==============="); 28 // 下载一个文件 29 boolean isDown = FtpUtil.downloadFtpFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, downloadPath, 30 uploadFileName, downloadFileName); 31 if (isDown) { 32 System.out.println("下载成功 !"); 33 } else { 34 System.out.println("下载失败 !"); 35 } 36 } catch (FileNotFoundException e) { 37 e.printStackTrace(); 38 System.out.println(e); 39 } 40 41 } 42 }
FtpUtil.java:
1 package FTP; 2 3 import org.apache.commons.net.ftp.FTPClient; 4 import org.apache.commons.net.ftp.FTPReply; 5 6 import java.io.*; 7 import java.net.SocketException; 8 9 public class FtpUtil { 10 11 /** 12 * 获取FTPClient对象 13 * 14 * @param ftpHost 15 * FTP主机服务器 16 * @param ftpPassword 17 * FTP 登录密码 18 * @param ftpUserName 19 * FTP登录用户名 20 * @param ftpPort 21 * FTP端口 默认为21 22 * @return 23 */ 24 public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, 25 String Function) { 26 FTPClient ftpClient = new FTPClient(); 27 try { 28 ftpClient = new FTPClient(); 29 ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器 30 ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器 31 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { 32 System.out.println("未连接到FTP,用户名或密码错误。"); 33 ftpClient.disconnect(); 34 } else { 35 System.out.println(Function + ":FTP连接成功。"); 36 } 37 } catch (SocketException e) { 38 e.printStackTrace(); 39 System.out.println("FTP的IP地址可能错误,请正确配置。"); 40 } catch (IOException e) { 41 e.printStackTrace(); 42 System.out.println("FTP的端口错误,请正确配置。"); 43 } 44 return ftpClient; 45 } 46 47 /** 48 * Description: 向FTP服务器上传文件 49 * 50 * @param ftpHost 51 * FTP服务器hostname 52 * @param ftpUserName 53 * 账号 54 * @param ftpPassword 55 * 密码 56 * @param ftpPort 57 * 端口 58 * @param ftpPath 59 * FTP服务器中文件所在路径 格式: ftptest/aa 60 * @param fileName 61 * ftp文件名称 62 * @param input 63 * 文件流 64 * @return 成功返回true,否则返回false 65 */ 66 public static boolean uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, 67 String ftpPath, String uploadFileName, InputStream input) { 68 boolean issuccess = false; 69 FTPClient ftpClient = null; 70 try { 71 int reply; 72 ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort, "上传"); 73 reply = ftpClient.getReplyCode(); 74 System.out.println("上传reply:" + reply); 75 if (!FTPReply.isPositiveCompletion(reply)) { 76 ftpClient.disconnect(); 77 return issuccess; 78 } 79 ftpClient.setControlEncoding("UTF-8"); // 中文支持 80 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 传输类型 81 if (!ftpClient.changeWorkingDirectory(ftpPath)) { 82 ftpClient.changeWorkingDirectory("/"); 83 String[] dirs = ftpPath.split("/"); 84 for (String dir : dirs) { 85 ftpClient.makeDirectory(dir); 86 ftpClient.changeWorkingDirectory(dir); 87 } 88 } 89 ftpClient.enterLocalPassiveMode();// 大部分用在Linux上 90 if (!ftpClient.storeFile(new String(uploadFileName.getBytes("GBK"), "iso-8859-1"), input)) { 91 return issuccess; 92 } 93 input.close(); 94 ftpClient.logout(); 95 issuccess = true; 96 } catch (IOException e) { 97 e.printStackTrace(); 98 } finally { 99 if (ftpClient.isConnected()) { 100 try { 101 ftpClient.disconnect(); 102 } catch (IOException ioe) { 103 } 104 } 105 } 106 return issuccess; 107 } 108 109 /* 110 * 从FTP服务器下载文件 111 * 112 * @param ftpHost FTP IP地址 113 * 114 * @param ftpUserName FTP 用户名 115 * 116 * @param ftpPassword FTP用户名密码 117 * 118 * @param ftpPort FTP端口 119 * 120 * @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa 121 * 122 * @param localPath 下载到本地的位置 格式:H:/download 123 * 124 * @param fileName 文件名称 125 */ 126 127 public static boolean downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, 128 String ftpPath, String downloadPath, String uploadFileName, String downloadFileName) { 129 boolean issuccess = false; 130 FTPClient ftpClient = null; 131 try { 132 ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort, "下载"); 133 ftpClient.setControlEncoding("UTF-8"); // 中文支持 134 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 135 ftpClient.enterLocalPassiveMode(); // 大部分用在Linux上 136 ftpClient.changeWorkingDirectory(ftpPath); // 切换到ftp的服务器路径 137 File localFile = new File(downloadPath + File.separatorChar + downloadFileName);// 设定要下载的路径 138 System.out.println("文件目录:" + localFile); 139 OutputStream os = new FileOutputStream(localFile); // 实例化 140 if (ftpClient.retrieveFile(new String(uploadFileName.getBytes("GBK"), "iso-8859-1"), os)) { // 将文件写入到下载的文件中 141 issuccess = true; 142 } 143 os.close(); 144 ftpClient.logout(); 145 } catch (FileNotFoundException e) { 146 System.out.println("没有找到" + ftpPath + "下载"); 147 e.printStackTrace(); 148 } catch (SocketException e) { 149 System.out.println("连接FTP失败."); 150 e.printStackTrace(); 151 } catch (IOException e) { 152 e.printStackTrace(); 153 System.out.println("文件读取错误。"); 154 e.printStackTrace(); 155 } 156 return issuccess; 157 } 158 }
六、总结
以上就是FTP实现简单的上传下载了。
遇到的坑是在上传的时候不能上传,我的不是中文命名问题,而是IIS配置权限问题,当时参考的百度经验里的ftp配置,结果权限中没有写入,导致不能上传。。。
连接的第9步没有勾选“写入”,(⊙o⊙)… :https://jingyan.baidu.com/article/0bc808fc408fa91bd585b94f.html
就到这里了,有什么问题评论里聊!