FTP 是File Transfer Protocol(文件傳輸協(xié)議)的英文簡(jiǎn)稱(chēng),而中文簡(jiǎn)稱(chēng)為“文傳協(xié)議”。用于Internet上的控制文件的雙向傳輸。同時(shí),它也是一個(gè)應(yīng)用程序(Application)。基于不同的操作系統(tǒng)有不同的FTP應(yīng)用程序,而所有這些應(yīng)用程序都遵守同一種協(xié)議以傳輸文件。在FTP的使用當(dāng)中,用戶(hù)經(jīng)常遇到兩個(gè)概念:"下載"(Download)和"上傳"(Upload)。"下載"文件就是從遠(yuǎn)程主機(jī)拷貝文件至自己的計(jì)算機(jī)上;"上傳"文件就是將文件從自己的計(jì)算機(jī)中拷貝至遠(yuǎn)程主機(jī)上。用Internet語(yǔ)言來(lái)說(shuō),用戶(hù)可通過(guò)客戶(hù)機(jī)程序向(從)遠(yuǎn)程主機(jī)上傳(下載)文件。
首先下載了Serv-U將自己的電腦設(shè)置為了FTP文件服務(wù)器,方便操作。下面代碼的使用都是在FTP服務(wù)器已經(jīng)創(chuàng)建,并且要在代碼中寫(xiě)好FTP連接的相關(guān)數(shù)據(jù)才可以完成。
1.FTP文件的上傳與下載(注意是單個(gè)文件的上傳與下載)
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
|
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /** * 實(shí)現(xiàn)FTP文件上傳和文件下載 */ public class FtpApche { private static FTPClient ftpClient = new FTPClient(); private static String encoding = System.getProperty( "file.encoding" ); /** * Description: 向FTP服務(wù)器上傳文件 * * @Version1.0 * @param url * FTP服務(wù)器hostname * @param port * FTP服務(wù)器端口 * @param username * FTP登錄賬號(hào) * @param password * FTP登錄密碼 * @param path * FTP服務(wù)器保存目錄,如果是根目錄則為“/” * @param filename * 上傳到FTP服務(wù)器上的文件名 * @param input * 本地文件輸入流 * @return 成功返回true,否則返回false */ public static boolean uploadFile(String url, int port, String username, String password, String path, String filename, InputStream input) { boolean result = false ; try { int reply; // 如果采用默認(rèn)端口,可以使用ftp.connect(url)的方式直接連接FTP服務(wù)器 ftpClient.connect(url); // ftp.connect(url, port);// 連接FTP服務(wù)器 // 登錄 ftpClient.login(username, password); ftpClient.setControlEncoding(encoding); // 檢驗(yàn)是否連接成功 reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { System.out.println( "連接失敗" ); ftpClient.disconnect(); return result; } // 轉(zhuǎn)移工作目錄至指定目錄下 boolean change = ftpClient.changeWorkingDirectory(path); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); if (change) { result = ftpClient.storeFile( new String(filename.getBytes(encoding), "iso-8859-1" ), input); if (result) { System.out.println( "上傳成功!" ); } } input.close(); ftpClient.logout(); } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } return result; } /** * 將本地文件上傳到FTP服務(wù)器上 * */ public void testUpLoadFromDisk() { try { FileInputStream in = new FileInputStream( new File( "D:/test02/list.txt" )); boolean flag = uploadFile( "10.0.0.102" , 21 , "admin" , "123456" , "/" , "lis.txt" , in); System.out.println(flag); } catch (FileNotFoundException e) { e.printStackTrace(); } } /** * Description: 從FTP服務(wù)器下載文件 * * @Version1.0 * @param url * FTP服務(wù)器hostname * @param port * FTP服務(wù)器端口 * @param username * FTP登錄賬號(hào) * @param password * FTP登錄密碼 * @param remotePath * FTP服務(wù)器上的相對(duì)路徑 * @param fileName * 要下載的文件名 * @param localPath * 下載后保存到本地的路徑 * @return */ public static boolean downFile(String url, int port, String username, String password, String remotePath, String fileName, String localPath) { boolean result = false ; try { int reply; ftpClient.setControlEncoding(encoding); /* * 為了上傳和下載中文文件,有些地方建議使用以下兩句代替 * new String(remotePath.getBytes(encoding),"iso-8859-1")轉(zhuǎn)碼。 * 經(jīng)過(guò)測(cè)試,通不過(guò)。 */ // FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT); // conf.setServerLanguageCode("zh"); ftpClient.connect(url, port); // 如果采用默認(rèn)端口,可以使用ftp.connect(url)的方式直接連接FTP服務(wù)器 ftpClient.login(username, password);// 登錄 // 設(shè)置文件傳輸類(lèi)型為二進(jìn)制 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 獲取ftp登錄應(yīng)答代碼 reply = ftpClient.getReplyCode(); // 驗(yàn)證是否登陸成功 if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); System.err.println("FTP server refused connection."); return result; } // 轉(zhuǎn)移到FTP服務(wù)器目錄至指定的目錄下 ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding),"iso-8859-1")); // 獲取文件列表 FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName)) { File localFile = new File(localPath + "/" + ff.getName()); OutputStream is = new FileOutputStream(localFile); ftpClient.retrieveFile(ff.getName(), is); is.close(); } } ftpClient.logout(); result = true; } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } return result; } /** * 將FTP服務(wù)器上文件下載到本地 * */ public void testDownFile() { try { boolean flag = downFile( "10.0.0.102" , 21 , "admin" , "123456" , "/" , "ip.txt" , "E:/" ); System.out.println(flag); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { FtpApche fa = new FtpApche(); fa.testDownFile(); fa.testUpLoadFromDisk(); } } |
2.FTP文件夾的上傳與下載(注意是整個(gè)文件夾)
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
|
package ftp; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.TimeZone; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.apache.log4j.Logger; public class FTPTest_04 { private FTPClient ftpClient; private String strIp; private int intPort; private String user; private String password; private static Logger logger = Logger.getLogger(FTPTest_04. class .getName()); /* * * Ftp構(gòu)造函數(shù) */ public FTPTest_04(String strIp, int intPort, String user, String Password) { this.strIp = strIp; this.intPort = intPort; this.user = user; this.password = Password; this.ftpClient = new FTPClient(); } /** * @return 判斷是否登入成功 * */ public boolean ftpLogin() { boolean isLogin = false; FTPClientConfig ftpClientConfig = new FTPClientConfig(); ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID()); this.ftpClient.setControlEncoding("GBK"); this.ftpClient.configure(ftpClientConfig); try { if (this.intPort > 0) { this.ftpClient.connect(this.strIp, this.intPort); }else { this.ftpClient.connect(this.strIp); } // FTP服務(wù)器連接回答 int reply = this.ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { this.ftpClient.disconnect(); logger.error("登錄FTP服務(wù)失敗!"); return isLogin; } this.ftpClient.login(this.user, this.password); // 設(shè)置傳輸協(xié)議 this.ftpClient.enterLocalPassiveMode(); this.ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); logger.info("恭喜" + this.user + "成功登陸FTP服務(wù)器"); isLogin = true; }catch (Exception e) { e.printStackTrace(); logger.error(this.user + "登錄FTP服務(wù)失敗!" + e.getMessage()); } this.ftpClient.setBufferSize(1024 * 2); this.ftpClient.setDataTimeout(30 * 1000); return isLogin; } /** * @退出關(guān)閉服務(wù)器鏈接 * */ public void ftpLogOut() { if (null != this.ftpClient && this.ftpClient.isConnected()) { try { boolean reuslt = this.ftpClient.logout();// 退出FTP服務(wù)器 if (reuslt) { logger.info("成功退出服務(wù)器"); } }catch (IOException e) { e.printStackTrace(); logger.warn("退出FTP服務(wù)器異常!" + e.getMessage()); }finally { try { this.ftpClient.disconnect();// 關(guān)閉FTP服務(wù)器的連接 }catch (IOException e) { e.printStackTrace(); logger.warn("關(guān)閉FTP服務(wù)器的連接異常!"); } } } } /*** * 上傳Ftp文件 * @param localFile 當(dāng)?shù)匚募? * @param romotUpLoadePath上傳服務(wù)器路徑 - 應(yīng)該以/結(jié)束 * */ public boolean uploadFile(File localFile, String romotUpLoadePath) { BufferedInputStream inStream = null; boolean success = false; try { this.ftpClient.changeWorkingDirectory(romotUpLoadePath);// 改變工作路徑 inStream = new BufferedInputStream(new FileInputStream(localFile)); logger.info(localFile.getName() + "開(kāi)始上傳....."); success = this.ftpClient.storeFile(localFile.getName(), inStream); if (success == true) { logger.info(localFile.getName() + "上傳成功"); return success; } }catch (FileNotFoundException e) { e.printStackTrace(); logger.error(localFile + "未找到"); }catch (IOException e) { e.printStackTrace(); }finally { if (inStream != null) { try { inStream.close(); }catch (IOException e) { e.printStackTrace(); } } } return success; } /*** * 下載文件 * @param remoteFileName 待下載文件名稱(chēng) * @param localDires 下載到當(dāng)?shù)啬莻€(gè)路徑下 * @param remoteDownLoadPath remoteFileName所在的路徑 * */ public boolean downloadFile(String remoteFileName, String localDires, String remoteDownLoadPath) { String strFilePath = localDires + remoteFileName; BufferedOutputStream outStream = null; boolean success = false; try { this.ftpClient.changeWorkingDirectory(remoteDownLoadPath); outStream = new BufferedOutputStream(new FileOutputStream( strFilePath)); logger.info(remoteFileName + "開(kāi)始下載...."); success = this.ftpClient.retrieveFile(remoteFileName, outStream); if (success == true) { logger.info(remoteFileName + "成功下載到" + strFilePath); return success; } }catch (Exception e) { e.printStackTrace(); logger.error(remoteFileName + "下載失敗"); }finally { if (null != outStream) { try { outStream.flush(); outStream.close(); }catch (IOException e) { e.printStackTrace(); } } } if (success == false) { logger.error(remoteFileName + "下載失敗!!!"); } return success; } /*** * @上傳文件夾 * @param localDirectory * 當(dāng)?shù)匚募A * @param remoteDirectoryPath * Ftp 服務(wù)器路徑 以目錄"/"結(jié)束 * */ public boolean uploadDirectory(String localDirectory, String remoteDirectoryPath) { File src = new File(localDirectory); try { remoteDirectoryPath = remoteDirectoryPath + src.getName() + "/"; boolean makeDirFlag = this.ftpClient.makeDirectory(remoteDirectoryPath); System.out.println("localDirectory : " + localDirectory); System.out.println("remoteDirectoryPath : " + remoteDirectoryPath); System.out.println("src.getName() : " + src.getName()); System.out.println("remoteDirectoryPath : " + remoteDirectoryPath); System.out.println("makeDirFlag : " + makeDirFlag); // ftpClient.listDirectories(); }catch (IOException e) { e.printStackTrace(); logger.info(remoteDirectoryPath + "目錄創(chuàng)建失敗"); } File[] allFile = src.listFiles(); for (int currentFile = 0;currentFile < allFile.length;currentFile++) { if (!allFile[currentFile].isDirectory()) { String srcName = allFile[currentFile].getPath().toString(); uploadFile(new File(srcName), remoteDirectoryPath); } } for (int currentFile = 0;currentFile < allFile.length;currentFile++) { if (allFile[currentFile].isDirectory()) { // 遞歸 uploadDirectory(allFile[currentFile].getPath().toString(), remoteDirectoryPath); } } return true; } /*** * @下載文件夾 * @param localDirectoryPath本地地址 * @param remoteDirectory 遠(yuǎn)程文件夾 * */ public boolean downLoadDirectory(String localDirectoryPath,String remoteDirectory) { try { String fileName = new File(remoteDirectory).getName(); localDirectoryPath = localDirectoryPath + fileName + "//" ; new File(localDirectoryPath).mkdirs(); FTPFile[] allFile = this .ftpClient.listFiles(remoteDirectory); for ( int currentFile = 0 ;currentFile < allFile.length;currentFile++) { if (!allFile[currentFile].isDirectory()) { downloadFile(allFile[currentFile].getName(),localDirectoryPath, remoteDirectory); } } for ( int currentFile = 0 ;currentFile < allFile.length;currentFile++) { if (allFile[currentFile].isDirectory()) { String strremoteDirectoryPath = remoteDirectory + "/" + allFile[currentFile].getName(); downLoadDirectory(localDirectoryPath,strremoteDirectoryPath); } } } catch (IOException e) { e.printStackTrace(); logger.info( "下載文件夾失敗" ); return false ; } return true ; } // FtpClient的Set 和 Get 函數(shù) public FTPClient getFtpClient() { return ftpClient; } public void setFtpClient(FTPClient ftpClient) { this .ftpClient = ftpClient; } public static void main(String[] args) throws IOException { FTPTest_04 ftp= new FTPTest_04( "10.0.0.102" , 21 , "admin" , "123456" ); ftp.ftpLogin(); System.out.println( "1" ); //上傳文件夾 boolean uploadFlag = ftp.uploadDirectory( "D:\\test02" , "/" ); //如果是admin/那么傳的就是所有文件,如果只是/那么就是傳文件夾 System.out.println( "uploadFlag : " + uploadFlag); //下載文件夾 ftp.downLoadDirectory( "d:\\tm" , "/" ); ftp.ftpLogOut(); } } |
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持服務(wù)器之家!
原文鏈接:http://www.cnblogs.com/winorgohome/p/6088013.html