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,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
251 3
|
8月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
383 14
|
9月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
591 5
|
8月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
239 0
|
8月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
591 0
|
11月前
|
Ubuntu 安全 网络安全
在Ubuntu系统下使用vsftpd配置FTP服务器的步骤
以上就是在Ubuntu系统下使用vsftpd配置FTP服务器的步骤。这些步骤都是基础的,但足够让你建立一个简单的FTP服务器。如果你需要更高级的功能,例如SSL加密、虚拟用户等,你可能需要进一步研究vsftpd的配置选项。
667 13
|
9月前
|
网络协议 安全 Java
实现Java语言的文件断点续传功能的技术方案。
像这样,我们就完成了一项看似高科技、实则亲民的小工程。这样的技术实现不仅具备实用性,也能在面对网络不稳定的挑战时,稳稳地、不失乐趣地完成工作。
493 0
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
503 4
|
安全 编译器 Linux
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
本文深入解析了利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,通过分析FreeFlow FTP 1.75版本的漏洞,展示了如何通过构造过长的用户名触发缓冲区溢出并调用计算器(`calc.exe`)。文章详细介绍了攻击原理、关键代码组件及其实现步骤,并提出了有效的防范措施,如输入验证、编译器保护和安全编程语言的选择,以保障系统的安全性。环境搭建基于Windows XP SP3和Kali Linux,使用Metasploit Framework进行攻击演示。请注意,此内容仅用于教育和研究目的。
495 4