Java通过FTP服务器上传下载文件的解决方案

简介:

  对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案。本文使用Apache Jakarta Commons Net(commons-net-3.3.jar)基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作。


  关于FileZilla Server服务器的详细搭建配置过程,详情请见FileZilla Server安装配置教程。之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲测上传2G的文件到FileZilla Server都没有该问题,朋友们可以放心使用该代码。


  FavFTPUtil.Java

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
package  com.favccxx.favsoft.util;
 
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.OutputStream;
 
import  org.apache.commons.net.ftp.FTPClient;
import  org.apache.commons.net.ftp.FTPFile;
import  org.apache.commons.net.ftp.FTPReply;
 
public  class  FavFTPUtil {
     
     /**
      * 上传文件(可供Action/Controller层使用)
      * @param hostname FTP服务器地址
      * @param port   FTP服务器端口号
      * @param username   FTP登录帐号
      * @param password   FTP登录密码
      * @param pathname   FTP服务器保存目录
      * @param fileName   上传到FTP服务器后的文件名称
      * @param inputStream 输入文件流
      * @return
      */
     public  static  boolean  uploadFile(String hostname,  int  port, String username, String password, String pathname, String fileName, InputStream inputStream){
         boolean  flag =  false ;
         FTPClient ftpClient =  new  FTPClient();
         ftpClient.setControlEncoding( "UTF-8" );
         try  {
             //连接FTP服务器
             ftpClient.connect(hostname, port);
             //登录FTP服务器
             ftpClient.login(username, password);
             //是否成功登录FTP服务器
             int  replyCode = ftpClient.getReplyCode();
             if (!FTPReply.isPositiveCompletion(replyCode)){
                 return  flag;
             }
             
             ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
             ftpClient.makeDirectory(pathname);
             ftpClient.changeWorkingDirectory(pathname);
             ftpClient.storeFile(fileName, inputStream);
             inputStream.close();
             ftpClient.logout();
             flag =  true ;
         catch  (Exception e) {
             e.printStackTrace();
         finally {
             if (ftpClient.isConnected()){
                 try  {
                     ftpClient.disconnect();
                 catch  (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
         return  flag;
     }
     
     
     /**
      * 上传文件(可对文件进行重命名)
      * @param hostname FTP服务器地址
      * @param port   FTP服务器端口号
      * @param username   FTP登录帐号
      * @param password   FTP登录密码
      * @param pathname   FTP服务器保存目录
      * @param filename   上传到FTP服务器后的文件名称
      * @param originfilename 待上传文件的名称(绝对地址)
      * @return
      */
     public  static  boolean  uploadFileFromProduction(String hostname,  int  port, String username, String password, String pathname, String filename, String originfilename){
         boolean  flag =  false ;
         try  {
             InputStream inputStream =  new  FileInputStream( new  File(originfilename));
             flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream);
         catch  (Exception e) {
             e.printStackTrace();
         }
         return  flag;
     }
     
     /**
      * 上传文件(不可以进行文件的重命名操作)
      * @param hostname FTP服务器地址
      * @param port   FTP服务器端口号
      * @param username   FTP登录帐号
      * @param password   FTP登录密码
      * @param pathname   FTP服务器保存目录
      * @param originfilename 待上传文件的名称(绝对地址)
      * @return
      */
     public  static  boolean  uploadFileFromProduction(String hostname,  int  port, String username, String password, String pathname, String originfilename){
         boolean  flag =  false ;
         try  {
             String fileName =  new  File(originfilename).getName();
             InputStream inputStream =  new  FileInputStream( new  File(originfilename));
             flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream);
         catch  (Exception e) {
             e.printStackTrace();
         }
         return  flag;
     }
     
     
     /**
      * 删除文件
      * @param hostname FTP服务器地址
      * @param port   FTP服务器端口号
      * @param username   FTP登录帐号
      * @param password   FTP登录密码
      * @param pathname   FTP服务器保存目录
      * @param filename   要删除的文件名称
      * @return
      */
     public  static  boolean  deleteFile(String hostname,  int  port, String username, String password, String pathname, String filename){
         boolean  flag =  false ;
         FTPClient ftpClient =  new  FTPClient();
         try  {
             //连接FTP服务器
             ftpClient.connect(hostname, port);
             //登录FTP服务器
             ftpClient.login(username, password);
             //验证FTP服务器是否登录成功
             int  replyCode = ftpClient.getReplyCode();
             if (!FTPReply.isPositiveCompletion(replyCode)){
                 return  flag;
             }
             //切换FTP目录
             ftpClient.changeWorkingDirectory(pathname);
             ftpClient.dele(filename);
             ftpClient.logout();
             flag =  true ;
         catch  (Exception e) {
             e.printStackTrace();
         finally {
             if (ftpClient.isConnected()){
                 try  {
                     ftpClient.logout();
                 catch  (IOException e) {
                 
                 }
             }
         }
         return  flag;
     }
     
     /**
      * 下载文件
      * @param hostname FTP服务器地址
      * @param port   FTP服务器端口号
      * @param username   FTP登录帐号
      * @param password   FTP登录密码
      * @param pathname   FTP服务器文件目录
      * @param filename   文件名称
      * @param localpath 下载后的文件路径
      * @return
      */
     public  static  boolean  downloadFile(String hostname,  int  port, String username, String password, String pathname, String filename, String localpath){
         boolean  flag =  false ;
         FTPClient ftpClient =  new  FTPClient();
         try  {
             //连接FTP服务器
             ftpClient.connect(hostname, port);
             //登录FTP服务器
             ftpClient.login(username, password);
             //验证FTP服务器是否登录成功
             int  replyCode = ftpClient.getReplyCode();
             if (!FTPReply.isPositiveCompletion(replyCode)){
                 return  flag;
             }
             //切换FTP目录
             ftpClient.changeWorkingDirectory(pathname);
             FTPFile[] ftpFiles = ftpClient.listFiles();
             for (FTPFile file : ftpFiles){
                 if (filename.equalsIgnoreCase(file.getName())){
                     File localFile =  new  File(localpath +  "/"  + file.getName());
                     OutputStream os =  new  FileOutputStream(localFile);
                     ftpClient.retrieveFile(file.getName(), os);
                     os.close();
                 }
             }
             ftpClient.logout();
             flag =  true ;
         catch  (Exception e) {
             e.printStackTrace();
         finally {
             if (ftpClient.isConnected()){
                 try  {
                     ftpClient.logout();
                 catch  (IOException e) {
                 
                 }
             }
         }
         return  flag;
     }
 
}


  FavFTPUtilTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package  com.favccxx.favsoft.util;
 
import  junit.framework.TestCase;
 
public  class  FavFTPTest  extends  TestCase {
     
     public  void  testFavFTPUtil(){
         String hostname =  "127.0.0.1" ;
         int  port =  21 ;
         String username =  "business" ;
         String password =  "business" ;
         String pathname =  "business/ebook"
         String filename =  "big.rar"
         String originfilename =  "C:\\Users\\Downloads\\Downloads.rar" ;
         FavFTPUtil.uploadFileFromProduction(hostname, port, username, password, pathname, filename, originfilename);
//      String localpath = "D:/";
         
//      FavFTPUtil.downloadFile(hostname, port, username, password, pathname, filename, localpath);
     }
 
}




本文转自 genuinecx 51CTO博客,原文链接:http://blog.51cto.com/favccxx/1677243,如需转载请自行联系原作者
目录
相关文章
|
2天前
|
存储 Java 数据库连接
Java中文乱码浅析解决方案
Java中文乱码浅析解决方案
9 0
|
3天前
|
Java 开发者
Java一分钟之-Java IO流:文件读写基础
【5月更文挑战第10天】本文介绍了Java IO流在文件读写中的应用,包括`FileInputStream`和`FileOutputStream`用于字节流操作,`BufferedReader`和`PrintWriter`用于字符流。通过代码示例展示了如何读取和写入文件,强调了常见问题如未关闭流、文件路径、编码、权限和异常处理,并提供了追加写入与读取的示例。理解这些基础知识和注意事项能帮助开发者编写更可靠的程序。
12 0
|
4天前
|
Java
JDK环境下利用记事本对java文件进行运行编译
JDK环境下利用记事本对java文件进行运行编译
13 0
|
4天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
4天前
|
Java
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
12 1
|
4天前
|
存储 缓存 安全
【Java多线程】线程安全问题与解决方案
【Java多线程】线程安全问题与解决方案
12 1
|
5天前
|
关系型数据库 MySQL Java
通过使用阿里云服务器,搭建Java程序的运行环境
通过使用阿里云服务器,搭建Java程序的运行环境
|
5天前
|
网络协议 Ubuntu Java
如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏
如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏
23 0
|
3天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
15 0
|
3天前
|
负载均衡 固态存储 Linux
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考
轻量应用服务器、云服务器、gpu云服务器是阿里云服务器产品中,比较热门的云服务器产品类型,不同类型的云服务器产品收费模式与收费标准是不一样的,本文为大家展示这几个云服务器产品的最新收费标准情况,以供参考。
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考