ftp上传下载Java实现详解编程语言

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Arrays; 
import java.util.List; 
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.FTPListParseEngine; 
import org.apache.commons.net.ftp.FTPReply; 
import org.dom4j.Document; 
import org.dom4j.DocumentHelper; 
import org.dom4j.Element; 
import org.dom4j.io.OutputFormat; 
import org.dom4j.io.XMLWriter; 
public class FtpHelper { 
private FTPClient ftp = null; 
/** 
* Ftp服务器 
*/ 
private String server; 
/** 
* 用户名 
*/ 
private String uname; 
/** 
* 密码 
*/ 
private String password; 
/** 
* 连接端口,默认21 
*/ 
private int port = 21; 
private Document document ; 
public FtpHelper(String server, int port, String uname, 
String password){ 
this.server = server; 
if (this.port > 0){ 
this.port = port; 
} 
this.uname = uname; 
this.password = password; 
//初始化 
ftp = new FTPClient(); 
} 
/** 
* 连接FTP服务器 
*  
* @param server 
* @param uname 
* @param password 
* @return 
* @throws Exception 
*/ 
public FTPClient connectFTPServer() throws Exception { 
try { 
ftp.configure(getFTPClientConfig()); 
ftp.connect(this.server, this.port); 
if (!ftp.login(this.uname, this.password)) { 
ftp.logout(); 
ftp = null; 
return ftp; 
} 
// 文件类型,默认是ASCII 
ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
ftp.setControlEncoding("GBK"); 
// 设置被动模式 
ftp.enterLocalPassiveMode(); 
//ftp.setConnectTimeout(2000); 
ftp.setBufferSize(1024); 
// 响应信息 
int replyCode = ftp.getReplyCode(); 
if ((!FTPReply.isPositiveCompletion(replyCode))) { 
// 关闭Ftp连接 
closeFTPClient(); 
// 释放空间 
ftp = null; 
throw new Exception("登录FTP服务器失败,请检查![Server:" + server + "、" 
+ "User:" + uname + "、" + "Password:" + password); 
} else { 
return ftp; 
} 
} catch (Exception e) { 
ftp.disconnect(); 
ftp = null; 
throw e; 
} 
} 
/** 
* 配置FTP连接参数 
*  
* @return 
* @throws Exception 
*/ 
public FTPClientConfig getFTPClientConfig() throws Exception { 
String systemKey = FTPClientConfig.SYST_NT; 
String serverLanguageCode = "zh"; 
FTPClientConfig conf = new FTPClientConfig(systemKey); 
conf.setServerLanguageCode(serverLanguageCode); 
conf.setDefaultDateFormatStr("yyyy-MM-dd"); 
return conf; 
} 
/** 
* 向FTP根目录上传文件 
*  
* @param localFile 
* @param newName 
*            新文件名 
* @throws Exception 
*/ 
public Boolean uploadFile(String localFile, String newName) 
throws Exception { 
InputStream input = null; 
boolean success = false; 
try { 
File file = null; 
if (checkFileExist(localFile)) { 
file = new File(localFile); 
} 
input = new FileInputStream(file); 
success = ftp.storeFile(newName, input); 
if (!success) { 
throw new Exception("文件上传失败!"); 
} 
} catch (Exception e) { 
throw e; 
} finally { 
if (input != null) { 
input.close(); 
} 
} 
return success; 
} 
/** 
* 向FTP根目录上传文件 
*  
* @param input 
* @param newName 
*            新文件名 
* @throws Exception 
*/ 
public Boolean uploadFile(InputStream input, String newName) 
throws Exception { 
boolean success = false; 
try { 
success = ftp.storeFile(newName, input); 
if (!success) { 
throw new Exception("文件上传失败!"); 
} 
} catch (Exception e) { 
throw e; 
} finally { 
if (input != null) { 
input.close(); 
} 
} 
return success; 
} 
/** 
* 向FTP指定路径上传文件 
*  
* @param localFile 
* @param newName 
*            新文件名 
* @param remoteFoldPath 
* @throws Exception 
*/ 
public Boolean uploadFile(String localFile, String newName, 
String remoteFoldPath) throws Exception { 
InputStream input = null; 
boolean success = false; 
try { 
File file = null; 
if (checkFileExist(localFile)) { 
file = new File(localFile); 
} 
input = new FileInputStream(file); 
// 改变当前路径到指定路径 
if (!this.changeDirectory(remoteFoldPath)) { 
System.out.println("服务器路径不存!"); 
return false; 
} 
success = ftp.storeFile(newName, input); 
if (!success) { 
throw new Exception("文件上传失败!"); 
} 
} catch (Exception e) { 
throw e; 
} finally { 
if (input != null) { 
input.close(); 
} 
} 
return success; 
} 
/** 
* 向FTP指定路径上传文件 
*  
* @param input 
* @param newName 
*            新文件名 
* @param remoteFoldPath 
* @throws Exception 
*/ 
public Boolean uploadFile(InputStream input, String newName, 
String remoteFoldPath) throws Exception { 
boolean success = false; 
try { 
// 改变当前路径到指定路径 
if (!this.changeDirectory(remoteFoldPath)) { 
System.out.println("服务器路径不存!"); 
return false; 
} 
success = ftp.storeFile(newName, input); 
if (!success) { 
throw new Exception("文件上传失败!"); 
} 
} catch (Exception e) { 
throw e; 
} finally { 
if (input != null) { 
input.close(); 
} 
} 
return success; 
} 
/** 
* 从FTP服务器下载文件 
*  
* @param remotePath 
*            FTP路径(不包含文件名) 
* @param fileName 
*            下载文件名 
* @param localPath 
*            本地路径 
*/ 
public Boolean downloadFile(String remotePath, String fileName, 
String localPath) throws Exception { 
BufferedOutputStream output = null; 
boolean success = false; 
try { 
// 检查本地路径 
this.checkFileExist(localPath); 
// 改变工作路径 
if (!this.changeDirectory(remotePath)) { 
System.out.println("服务器路径不存在"); 
return false; 
} 
// 列出当前工作路径下的文件列表 
List<FTPFile> fileList = this.getFileList(); 
if (fileList == null || fileList.size() == 0) { 
System.out.println("服务器当前路径下不存在文件!"); 
return success; 
} 
for (FTPFile ftpfile : fileList) { 
if (ftpfile.getName().equals(fileName)) { 
File localFilePath = new File(localPath + File.separator 
+ ftpfile.getName()); 
output = new BufferedOutputStream(new FileOutputStream( 
localFilePath)); 
success = ftp.retrieveFile(ftpfile.getName(), output); 
} 
} 
if (!success) { 
throw new Exception("文件下载失败!"); 
} 
} catch (Exception e) { 
throw e; 
} finally { 
if (output != null) { 
output.close(); 
} 
} 
return success; 
} 
/** 
* 从FTP服务器获取文件流 
*  
* @param remoteFilePath 
* @return 
* @throws Exception 
*/ 
public InputStream downloadFile(String remoteFilePath) throws Exception { 
return ftp.retrieveFileStream(remoteFilePath); 
} 
/** 
* 获取FTP服务器上指定路径下的文件列表 
*  
* @param filePath 
* @return 
*/ 
public List<FTPFile> getFtpServerFileList(String remotePath) 
throws Exception { 
FTPListParseEngine engine = ftp.initiateListParsing(remotePath); 
List<FTPFile> ftpfiles = Arrays.asList(engine.getNext(25)); 
return ftpfiles; 
} 
/** 
* 获取FTP服务器上[指定路径]下的文件列表 
*  
* @param path 
* @return 
* @throws Exception 
*/ 
public List<FTPFile> getFileList(String remotePath) throws Exception { 
List<FTPFile> ftpfiles = Arrays.asList(ftp.listFiles(remotePath)); 
return ftpfiles; 
} 
/** 
* 获取FTP服务器[当前工作路径]下的文件列表 
*  
* @param path 
* @return 
* @throws Exception 
*/ 
public List<FTPFile> getFileList() throws Exception { 
List<FTPFile> ftpfiles = Arrays.asList(ftp.listFiles()); 
return ftpfiles; 
} 
/** 
* 改变FTP服务器工作路径  
*  
* @param remoteFoldPath 
*/ 
public Boolean changeDirectory(String remoteFoldPath) throws Exception { 
return ftp.changeWorkingDirectory(remoteFoldPath); 
} 
/** 
* 删除文件 
*  
* @param remoteFilePath 
* @return 
* @throws Exception 
*/ 
public Boolean deleteFtpServerFile(String remoteFilePath) throws Exception { 
return ftp.deleteFile(remoteFilePath); 
} 
/** 
* 创建目录 
*  
* @param remoteFoldPath 
* @return 
*/ 
public boolean createFold(String remoteFoldPath) throws Exception { 
boolean flag = ftp.makeDirectory(remoteFoldPath); 
if (!flag) { 
throw new Exception("创建目录失败"); 
} 
return false; 
} 
/** 
* 删除目录 
* @param remoteFoldPath 
* @return 
* @throws Exception 
*/ 
public boolean deleteFold(String remoteFoldPath) throws Exception { 
return ftp.removeDirectory(remoteFoldPath) ; 
} 
/** 
* 删除目录以及文件 
*  
* @param remoteFoldPath 
* @return 
*/ 
public boolean deleteFoldAndsubFiles(String remoteFoldPath) 
throws Exception { 
boolean success = false; 
List<FTPFile> list = this.getFileList(remoteFoldPath); 
if (list == null || list.size() == 0) { 
return deleteFold(remoteFoldPath); 
} 
for (FTPFile ftpFile : list) { 
String name = ftpFile.getName(); 
if (ftpFile.isDirectory()) { 
success = deleteFoldAndsubFiles(remoteFoldPath + "/" + name); 
if (!success) 
break; 
} else { 
success = deleteFtpServerFile(remoteFoldPath + "/" + name); 
if (!success) 
break; 
} 
} 
if (!success) 
return false; 
success = deleteFold(remoteFoldPath); 
return success; 
} 
/** 
* 检查本地路径是否存在 
*  
* @param filePath 
* @return 
* @throws Exception 
*/ 
public boolean checkFileExist(String filePath) throws Exception { 
boolean flag = false; 
File file = new File(filePath); 
if (!file.exists()) { 
throw new Exception("本地路径不存在,请检查!"); 
} else { 
flag = true; 
} 
return flag; 
} 
/** 
* 创建XML文件 
* @return 
*/ 
public Element getCurrentElement(){ 
document = DocumentHelper.createDocument(); 
return document.addElement("root"); 
} 
/** 
* 生成目录XML文件 
*/ 
public void createDirectoryXML(String remotePath,Element fatherElement) throws Exception{ 
List<FTPFile> list = this.getFileList(); 
for(FTPFile ftpfile:list){ 
Element currentElement = fatherElement; //当前的目录节点 
String newRemotePath = remotePath+ftpfile.getName(); 
if(ftpfile.isDirectory()){ 
Element dirElement = fatherElement.addElement("dir") ; 
dirElement.addAttribute("name",ftpfile.getName()); 
currentElement = dirElement; 
this.changeDirectory(newRemotePath); //从根目录开始 
createDirectoryXML(newRemotePath,dirElement); 
}else{ 
Element fileElement = fatherElement.addElement("file");//文件节点 
fileElement.setText(ftpfile.getName()) ; 
} 
} 
} 
/** 
* 保存xml 
*/ 
public void saveXML(){ 
XMLWriter output = new XMLWriter(); 
//输出格式化 
OutputFormat format = OutputFormat.createPrettyPrint(); 
try { 
output = new XMLWriter(new FileWriter("src/com/shine/Ftp/config/dir.xml"), format); 
output.write(this.document); 
output.close(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 
/** 
* 关闭FTP连接 
*  
* @param ftp 
* @throws Exception 
*/ 
public void closeFTPClient(FTPClient ftp) throws Exception { 
try { 
if (ftp.isConnected()) 
ftp.logout(); 
ftp.disconnect(); 
} catch (Exception e) { 
throw new Exception("关闭FTP服务出错!"); 
} 
} 
/** 
* 关闭FTP连接 
*  
* @throws Exception 
*/ 
public void closeFTPClient() throws Exception { 
this.closeFTPClient(this.ftp); 
} 
/** 
* Get Attribute Method 
*  
*/ 
public FTPClient getFtp() { 
return ftp; 
} 
public String getServer() { 
return server; 
} 
public String getUname() { 
return uname; 
} 
public String getPassword() { 
return password; 
} 
public int getPort() { 
return port; 
} 
/** 
* Set Attribute Method 
*  
*/ 
public void setFtp(FTPClient ftp) { 
this.ftp = ftp; 
} 
public void setServer(String server) { 
this.server = server; 
} 
public void setUname(String uname) { 
this.uname = uname; 
} 
public void setPassword(String password) { 
this.password = password; 
} 
public void setPort(int port) { 
this.port = port; 
} 
/** 
* 主方法(测试) 
*  
* 问题:上传时命名的新文件名不能有中文,否则上传失败. 
*  
* @param args 
*/ 
public static void main(String[] args) { 
try { 
FtpHelper fu = new FtpHelper("192.168.2.18", 21, "administrator","sunshine"); 
fu.connectFTPServer(); 
Element fatherElement = fu.getCurrentElement(); 
fu.createDirectoryXML("/", fatherElement); 
fu.saveXML(); 
} catch (Exception e) { 
System.out.println("异常信息:" + e.getMessage()); 
} 
} 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10881.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论