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

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

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

}

   

你可能感兴趣的:(server,ftp,ftp,FileZilla)