ftp上传下载Java实现

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

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());

}

}

}