Java FTP上傳下載(簡單實現)


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 }
Main.java

 

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 }
FtpUtil.java

 

 

 六、總結

以上就是FTP實現簡單的上傳下載了。

遇到的坑是在上傳的時候不能上傳,我的不是中文命名問題,而是IIS配置權限問題,當時參考的百度經驗里的ftp配置,結果權限中沒有寫入,導致不能上傳。。。

連接的第9步沒有勾選“寫入”,(⊙o⊙)… :https://jingyan.baidu.com/article/0bc808fc408fa91bd585b94f.html

 

就到這里了,有什么問題評論里聊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM