一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java實現FTP文件上傳與文件下載

java實現FTP文件上傳與文件下載

2020-04-18 12:00游趣吧 JAVA教程

這篇文章主要為大家詳細介紹了java實現FTP文件上傳與文件下載的相關資料,通過以下兩種方式實現,通過JDK自帶的API實現,二是通過Apache提供的API是實現,感興趣的小伙伴們可以參考一下

本文實例為大家分享了兩種java實現FTP文件上傳下載的方式,供大家參考,具體內容如下

第一種方式:

?
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
package com.cloudpower.util;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
 
/**
 * Java自帶的API對FTP的操作
 * @Title:Ftp.java
 * @author: 周玲斌
 */
public class Ftp {
 /**
 * 本地文件名
 */
 private String localfilename;
 /**
 * 遠程文件名
 */
 private String remotefilename;
 /**
 * FTP客戶端
 */
 private FtpClient ftpClient;
 
 /**
 * 服務器連接
 * @param ip 服務器IP
 * @param port 服務器端口
 * @param user 用戶名
 * @param password 密碼
 * @param path 服務器路徑
 * @author 周玲斌
 * @date 2012-7-11
 */
 public void connectServer(String ip, int port, String user,
  String password, String path) {
 try {
  /* ******連接服務器的兩種方法*******/
  //第一種方法
//  ftpClient = new FtpClient();
//  ftpClient.openServer(ip, port);
  //第二種方法
  ftpClient = new FtpClient(ip);
  
  ftpClient.login(user, password);
  // 設置成2進制傳輸
  ftpClient.binary();
  System.out.println("login success!");
  if (path.length() != 0){
  //把遠程系統上的目錄切換到參數path所指定的目錄
  ftpClient.cd(path);
  }
  ftpClient.binary();
 } catch (IOException ex) {
  ex.printStackTrace();
  throw new RuntimeException(ex);
 }
 }
 /**
 * 關閉連接
 * @author 周玲斌
 * @date 2012-7-11
 */
 public void closeConnect() {
 try {
  ftpClient.closeServer();
  System.out.println("disconnect success");
 } catch (IOException ex) {
  System.out.println("not disconnect");
  ex.printStackTrace();
  throw new RuntimeException(ex);
 }
 }
 /**
 * 上傳文件
 * @param localFile 本地文件
 * @param remoteFile 遠程文件
 * @author 周玲斌
 * @date 2012-7-11
 */
 public void upload(String localFile, String remoteFile) {
 this.localfilename = localFile;
 this.remotefilename = remoteFile;
 TelnetOutputStream os = null;
 FileInputStream is = null;
 try {
  //將遠程文件加入輸出流中
  os = ftpClient.put(this.remotefilename);
  //獲取本地文件的輸入流
  File file_in = new File(this.localfilename);
  is = new FileInputStream(file_in);
  //創建一個緩沖區
  byte[] bytes = new byte[1024];
  int c;
  while ((c = is.read(bytes)) != -1) {
  os.write(bytes, 0, c);
  }
  System.out.println("upload success");
 } catch (IOException ex) {
  System.out.println("not upload");
  ex.printStackTrace();
  throw new RuntimeException(ex);
 } finally{
  try {
  if(is != null){
   is.close();
  }
  } catch (IOException e) {
  e.printStackTrace();
  } finally {
  try {
   if(os != null){
   os.close();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
 }
 }
 
 /**
 * 下載文件
 * @param remoteFile 遠程文件路徑(服務器端)
 * @param localFile 本地文件路徑(客戶端)
 * @author 周玲斌
 * @date 2012-7-11
 */
 public void download(String remoteFile, String localFile) {
 TelnetInputStream is = null;
 FileOutputStream os = null;
 try {
  //獲取遠程機器上的文件filename,借助TelnetInputStream把該文件傳送到本地。
  is = ftpClient.get(remoteFile);
  File file_in = new File(localFile);
  os = new FileOutputStream(file_in);
  byte[] bytes = new byte[1024];
  int c;
  while ((c = is.read(bytes)) != -1) {
  os.write(bytes, 0, c);
  }
  System.out.println("download success");
 } catch (IOException ex) {
  System.out.println("not download");
  ex.printStackTrace();
  throw new RuntimeException(ex);
 } finally{
  try {
  if(is != null){
   is.close();
  }
  } catch (IOException e) {
  e.printStackTrace();
  } finally {
  try {
   if(os != null){
   os.close();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
 }
 }
 
 public static void main(String agrs[]) {
 
 String filepath[] = { "/temp/aa.txt", "/temp/regist.log"};
 String localfilepath[] = { "C:\\tmp\\1.txt","C:\\tmp\\2.log"};
 
 Ftp fu = new Ftp();
 /*
  * 使用默認的端口號、用戶名、密碼以及根目錄連接FTP服務器
  */
 fu.connectServer("127.0.0.1", 22, "anonymous", "IEUser@", "/temp");
 
 //下載
 for (int i = 0; i < filepath.length; i++) {
  fu.download(filepath[i], localfilepath[i]);
 }
 
 String localfile = "E:\\號碼.txt";
 String remotefile = "/temp/哈哈.txt";
 //上傳
 fu.upload(localfile, remotefile);
 fu.closeConnect();
 }
}

這種方式沒啥可說的,比較簡單,也不存在中文亂碼的問題。貌似有個缺陷,不能操作大文件,有興趣的朋友可以試試。

第二種方式:

?
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
public class FtpApche {
 private static FTPClient ftpClient = new FTPClient();
 private static String encoding = System.getProperty("file.encoding");
 /**
 * Description: 向FTP服務器上傳文件
 *
 * @Version1.0
 * @param url
 *  FTP服務器hostname
 * @param port
 *  FTP服務器端口
 * @param username
 *  FTP登錄賬號
 * @param password
 *  FTP登錄密碼
 * @param path
 *  FTP服務器保存目錄,如果是根目錄則為“/”
 * @param filename
 *  上傳到FTP服務器上的文件名
 * @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;
  // 如果采用默認端口,可以使用ftp.connect(url)的方式直接連接FTP服務器
  ftpClient.connect(url);
  // ftp.connect(url, port);// 連接FTP服務器
  // 登錄
  ftpClient.login(username, password);
  ftpClient.setControlEncoding(encoding);
  // 檢驗是否連接成功
  reply = ftpClient.getReplyCode();
  if (!FTPReply.isPositiveCompletion(reply)) {
  System.out.println("連接失敗");
  ftpClient.disconnect();
  return result;
  }
 
  // 轉移工作目錄至指定目錄下
  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服務器上
 *
 */
 public void testUpLoadFromDisk() {
 try {
  FileInputStream in = new FileInputStream(new File("E:/號碼.txt"));
  boolean flag = uploadFile("127.0.0.1", 21, "zlb","123", "/", "哈哈.txt", in);
  System.out.println(flag);
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
 }
 
 
 /**
 * Description: 從FTP服務器下載文件
 *
 * @Version1.0
 * @param url
 *  FTP服務器hostname
 * @param port
 *  FTP服務器端口
 * @param username
 *  FTP登錄賬號
 * @param password
 *  FTP登錄密碼
 * @param remotePath
 *  FTP服務器上的相對路徑
 * @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")轉碼。
  * 經過測試,通不過。
  */
//  FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
//  conf.setServerLanguageCode("zh");
 
  ftpClient.connect(url, port);
  // 如果采用默認端口,可以使用ftp.connect(url)的方式直接連接FTP服務器
  ftpClient.login(username, password);// 登錄
  // 設置文件傳輸類型為二進制
  ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
  // 獲取ftp登錄應答代碼
  reply = ftpClient.getReplyCode();
  // 驗證是否登陸成功
  if (!FTPReply.isPositiveCompletion(reply)) {
  ftpClient.disconnect();
  System.err.println("FTP server refused connection.");
  return result;
  }
  // 轉移到FTP服務器目錄至指定的目錄下
  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服務器上文件下載到本地
 *
 */
 public void testDownFile() {
 try {
  boolean flag = downFile("127.0.0.1", 21, "zlb",
   "123", "/", "哈哈.txt", "D:/");
  System.out.println(flag);
 } catch (Exception e) {
  e.printStackTrace();
 }
 }
 
 public static void main(String[] args) {
 FtpApche fa = new FtpApche();
 fa.testDownFile();
 }
}

這種方式的話需要注意中文亂碼問題啦,如果你設置不恰當,有可能上傳的文件名會為亂碼,有的時候根本就上傳不上去,當然,也不會跟你提示,因為原本就沒異常。在網上找了好多解答方案,眾說紛紜,幾乎都是從一個版本拷貝過去的,也沒有經過自己的真是檢驗。為此,也吃了不少苦頭。大致分為以下兩種解決方案:
1、加上以下三句即可解決

ftpClient.setControlEncoding(“GBK”);

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
解答:經過測試,根本上行不通,上述問題依然存在

2、與上述方式有所類似,但我覺得這種方式更靠譜一點

首先,加上ftpClient.setControlEncoding(“GBK”);這一句,然后,將所有的中文進行轉碼為“ISO-8859-1”格式,如下:

ftpClient.changeWorkingDirectory(new String(remotePath.getBytes("GBK"),"iso-8859-1"));

解答:經過測試,仍然行不通,之所以我說此方式更靠譜一點,請繼續往下看

首先我們來說說為什么要進行轉碼:

因為在FTP協議里面,規定文件名編碼為iso-8859-1,所以目錄名或文件名需要轉碼。

接下來的問題是,我們應該將什么編碼轉換為此格式。因此,就有了第二種解決方案——把 GBK格式的轉換為ISO-8859-1格式。而且,有的人還說,必須得這么轉。其實,之所以他們能這么說,我覺得完全是巧合。它的真正原理是,既然 FTP協議規定的編碼格式是“ISO-8859-1”,那么我們確實得將格式轉換一下,然后等服務器收到文件時再自動轉換為系統自帶的編碼格式,因此,關鍵不是規定為什么格式,而是取決于FTP服務器的編碼格式。因此,如果FTP系統的編碼格式為“GBK”時,第二種方式肯定會成功;但是,如果系統的編碼格式為“UTF-8”時,那就會仍然出現亂碼啦。所以,我們只能通過代碼先獲取系統的編碼格式,然后通過此編碼格式轉換為ISO-8859-1的編碼格式。獲取方式如下:

private static String encoding = System.getProperty("file.encoding");

以上代碼均通過自己測試,望能為大家解決一下問題!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲热在线视频 | 火影小南被爆羞羞网站 | 欧美一级裸片 | 国产1区精品 | 猛操美女 | 美女脱了内裤打开腿让人羞羞软件 | 精品国产品香蕉在线观看75 | 亚洲国产成人久久99精品 | 欧美精品一区二区三区久久 | 四虎影视在线看免费 720p | 歪歪视频在线播放无遮挡 | 青青青国产成人久久111网站 | 国产亚洲精品一区在线播 | 91制片厂果冻传媒杨柳作品 | 欧美一级鲁丝片免费看 | 18未年禁止免费观看 | www.四虎com| 动漫美女被羞羞产奶 | 男人女人性生活视频 | 欧美a在线| 肉文小说| 2015台湾永久免费平台 | 东北美女野外bbwbbw免费 | 999久久久免费精品国产牛牛 | 国产在线视频资源 | 日本色淫| 91对白在线 | 国产色视频一区二区三区 | 日本人作爰啪啪全过程 | 国模孕妇季玥337p人体 | 奇米777狠狠 | 国产精品毛片va一区二区三区 | beeg日本高清xxxx18 | 精品小视频在线观看 | 欧美日韩在线观看区一二 | 成人啪啪漫画全文阅读 | 精品午夜寂寞黄网站在线 | 久久热国产在线视频 | 色老板在线视频 | 久久噜国产精品拍拍拍拍 | 我被黑人彻底征服的全文 |