服务器之家

服务器之家 > 正文

Java FTPClient实现文件上传下载

时间:2020-04-18 12:01     来源/作者:lijiao

在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件。
所用到的jar包有: 
commons-net-1.4.1.jar 
jakarta-oro.jar 

一、上传文件

?
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
文件上传源代码
   /**
  * 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,//FTP服务器hostname
   int port,//FTP服务器端口
   String username, // FTP登录账号
   String password, //FTP登录密码
   String path, //FTP服务器保存目录
   String filename, //上传到FTP服务器上的文件名
   InputStream input // 输入流
   ) {
  boolean success = false;
  FTPClient ftp = new FTPClient();
  try {
   int reply;
   ftp.connect(url, port);//连接FTP服务器 
   //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 
   ftp.login(username, password);//登录 
   reply = ftp.getReplyCode();
   if (!FTPReply.isPositiveCompletion(reply)) {
    ftp.disconnect();
    return success;
   }
   ftp.changeWorkingDirectory(path);
   ftp.storeFile(filename, input);   
    
   input.close();
   ftp.logout();
   success = true;
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (ftp.isConnected()) {
    try {
     ftp.disconnect();
    } catch (IOException ioe) {
    }
   }
  }
  return success;
 }

以下是文件上传的测试用例:

?
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
/**
 * 将本地文件上传到FTP服务器上
 *
 */
public void testUpLoadFromDisk(){
 try {
  FileInputStream in=new FileInputStream(new File("D:/test.txt"));
  boolean flag = uploadFile("127.0.0.1", 21, "administrator", "zyuc2011", "test", "test.txt", in);
  System.out.println(flag);
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 
}
/**
 * 在FTP服务器上生成一个文件,并将一个字符串写入到该文件中
 *
 */
public void testUpLoadFromString(){
 try {
  String str = "这是要写入的字符串!";
  InputStream input = new ByteArrayInputStream(str.getBytes("utf-8"));
  boolean flag = uploadFile("127.0.0.1", 21, "administrator", "zyuc2011", "test", "test.txt", input);
  System.out.println(flag);
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 }
}

二、文件下载
文件下载源代码  

?
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
/**
 * 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, //FTP服务器hostname
  int port,//FTP服务器端口
  String username, //FTP登录账号
  String password, //FTP登录密码
  String remotePath,//FTP服务器上的相对路径
  String fileName,//要下载的文件名
  String localPath//下载后保存到本地的路径
  ) {
 boolean success = false;
 FTPClient ftp = new FTPClient();
 try {
  int reply;
  ftp.connect(url, port);
  //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 
  ftp.login(username, password);//登录 
  reply = ftp.getReplyCode();
  if (!FTPReply.isPositiveCompletion(reply)) {
   ftp.disconnect();
   return success;
  }
  ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录 
  FTPFile[] fs = ftp.listFiles();
  for(FTPFile ff:fs){
   if(ff.getName().equals(fileName)){
    File localFile = new File(localPath+"/"+ff.getName());
    OutputStream is = new FileOutputStream(localFile); 
    ftp.retrieveFile(ff.getName(), is);
    is.close();
   }
  }
   
  ftp.logout();
  success = true;
 } catch (IOException e) {
  e.printStackTrace();
 } finally {
  if (ftp.isConnected()) {
   try {
    ftp.disconnect();
   } catch (IOException ioe) {
   }
  }
 }
 return success;
}

以下是文件下载的测试用例:

?
1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 将FTP服务器上文件下载到本地
 *
 */
public void testDownFile(){
 try {
  boolean flag = downFile("127.0.0.1", 21, "administrator", "zyuc2011", "test", "test.txt", "D:/");
  System.out.println(flag);
 } catch (Exception e) {
  e.printStackTrace();
 }  
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

标签:

相关文章

热门资讯

沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
返回顶部