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
就到這里了,有什么問題評論里聊!