`
lfc_jack
  • 浏览: 144802 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

FTP上传文件功能

ftp 
阅读更多
ftp上传功能是很多的应用软件都必备的一个基础功能,特别是CMS系统,这个是必须的功能:
下面就来写下ftp上传主要的功能代码吧;

第一步:准备工作:需要的jar包是:commons net 3.3.jar,commons.io.jar,这个可以在网络上找到的。版本不一定是这个的。把下载的jar包加入到maven的pom.xml或者放到lib目录下面。
commons net 3.3.jar下载地址:http://download.csdn.net/download/hdh1988/5808981

第二步:把ftp上传功能所有的功能都写,封装成一个封装类:
主要的功能有上传,下载,删除等:


package bianliang.com;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;







public class FtpUtil {
	private String ip;
	private int port;
	private String username;
	private String password;
	private boolean isPrepared = false;

	protected FTPClient ftpClient = null;
  /**
   * ftpConfig配置的的顺序是:ftp上传的ip#端口#登录用户名#密码
   * @param ftpConfig
   * @throws FtpException
   */
	public FtpUtil(String ftpConfig) throws FtpException {
		String[] configs = ftpConfig.split("#");
		if (configs.length != 4) {
			throw new FtpException("FTP连接参数格式错误");
		} else {
			this.ip = configs[0];
			this.port = Integer.valueOf(configs[1]);
			this.username = configs[2];
			this.password = configs[3];
		}
	}

	/**
	 * 登录到FTP Server
	 * 
	 * @return
	 * @throws FtpException
	 */
	public boolean connect() throws FtpException{
		boolean result = false;
		try {
			ftpClient = new FTPClient();
			ftpClient.setControlEncoding("UTF-8");
			ftpClient.connect(ip, port);
			result = ftpClient.login(username, password);
			if (result) {
				ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
				ftpClient.setBufferSize(1024 * 2);
				ftpClient.setDataTimeout(3000);
				this.isPrepared = true;
				return true;
			} else {
				ftpClient.disconnect();
				throw new FtpException( "用户名或密码错误");
			}
		} catch (IOException e) {
			ftpClient = null;
			throw new FtpException(e.getMessage());
		}
	}

	/**
	 * 退出登录并断开连接
	 * 
	 * @return
	 * @throws FtpException
	 */
	public boolean disconnect() throws FtpException {
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		try {
			this.ftpClient.disconnect();
		} catch (IOException e) {
			throw new FtpException(e.getMessage());
		}
		return true;
	}

	/**
	 * 上传文件
	 * 
	 * @param localFile 上传本地文件的文件名
	 * @param remoteFileName
	 * @throws FtpException
	 * @return
	 */
	public boolean uploadFile(String localFileName, String remoteFileName) throws FtpException {
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		checkAndCreateDirectory(remoteFileName);
		File localFile = new File(localFileName);
		boolean result = false;
		FileInputStream inputStream = null;
		try {
			ftpClient.enterLocalPassiveMode();
			inputStream = new FileInputStream(localFile);
			result = ftpClient.storeFile(remoteFileName, inputStream);
			int code = ftpClient.getReplyCode();
			if (FTPReply.isPositiveCompletion(code)) {
				Logger.info("FTP工具", "上传文件至FTP", "FtpUtil", "method", "uploadFile", "上传文件成功:" + this.ip + remoteFileName);
			} else {
				throw new FtpException("向FTP上传文件出错:" + this.ip + remoteFileName + "Reply Code:" + code);
			}
		} catch (IOException e) {
			throw new FtpException( e.getMessage());
		} finally {
			if (inputStream != null)
				try {
					inputStream.close();
				} catch (IOException e) {
					throw new FtpException( e.getMessage());
				}
		}
		try {
			ftpClient.pwd();// 没有实际作用的指令,用来避免有时候上传到FTP的文件大小变为0的问题
		} catch (IOException e) {
			throw new FtpException( e.getMessage());
		} 
		return result;
	}
	
	/**
	 * 上传文件夹(包含子文件夹)
	 * 
	 * @param localFolderPath
	 * @param remoteFolderPath
	 * @return
	 * @throws FtpException
	 */
	public boolean uploadFolder(String localFolderPath, String remoteFolderPath) throws FtpException{
		boolean result = false;
		for (String fileName : getLocalFileNameList(localFolderPath)) {
			String relativePath = fileName.substring(localFolderPath.length()).replaceAll("\\\\", "/");
			result = uploadFile(fileName, remoteFolderPath + relativePath);
		}
		return result;
	}
	

	/**
	 * 将String中的内容保存至远程指定文件
	 * 
	 * @param uploadString
	 * @param remoteFileName
	 * @throws FtpException
	 * @return
	 */
	public boolean uploadString(String uploadString, String remoteFileName) throws FtpException{
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		boolean result = false;
		InputStream inputStream = null;
		try {
			inputStream = new ByteArrayInputStream(uploadString.getBytes("UTF-8"));
			checkAndCreateDirectory(remoteFileName);
			ftpClient.enterLocalPassiveMode();
			result = ftpClient.storeFile(remoteFileName, inputStream);
			int code = ftpClient.getReplyCode();
			if (FTPReply.isPositiveCompletion(code)) {
				logger.info(log, "FTP工具", "上传字符串至FTP", "FtpUtil", "method", "uploadString", "上传字符串成功:" + this.ip +remoteFileName);
			} else {
				throw new FtpException( "向FTP上传字符串出错:" + this.ip + remoteFileName + ",Reply Code:" + code);
			}
		} catch (Exception e) {
			throw new FtpException( e.getMessage());
		} finally {
			if (inputStream != null){
				try {
					inputStream.close();
				} catch (IOException e) {
					throw new FtpException( e.getMessage());
				}
			}
		}
		try {
			ftpClient.pwd();// 没有实际作用的指令,用来避免有时候上传到FTP的文件大小变为0的问题
		} catch (IOException e) {
			throw new FtpException( e.getMessage());
		} 
		return result;
	}

	/**
	 * 从服务器下载文件
	 * 
	 * @param localFileName
	 * @param remoteFileName
	 * @throws FtpException
	 */
	public boolean downloadFile(String localFileName, String remoteFileName) throws FtpException {
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		File fileDir = new File(localFileName);
		if (!fileDir.getParentFile().exists()) {
			fileDir.getParentFile().mkdirs();
		}
		BufferedOutputStream outputStream = null;
		boolean result = false;
		try {
			outputStream = new BufferedOutputStream(new FileOutputStream(localFileName));
			result = this.ftpClient.retrieveFile(remoteFileName, outputStream);
			if (result) {
				logger.info(log, "FTP工具", "从FTP下载文件", "FtpUtil", "method", "downloadFile", "从FTP下载文件成功:" + localFileName);
			} else {
				throw new FtpException( "从FTP下载文件出错:" + remoteFileName);
			}
		} catch (Exception e) {
			throw new FtpException( e.getMessage());
		} finally {
			if (outputStream != null) {
				try {
					outputStream.flush();
					outputStream.close();
				} catch (IOException e) {
					throw new FtpException( e.getMessage());
				}
			}
		}
		return result;
	}

	/**
	 * 从服务器文件获取String
	 * 
	 * @param remoteFileName
	 * @return String
	 * @throws FtpException
	 */
	public String downloadString(String remoteFileName) throws FtpException{
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		
		String result = null;		
		try {
		    
		    InputStream inputStream = ftpClient.retrieveFileStream(remoteFileName);
			
			if (inputStream != null) {
			    
			    result = IOUtils.toString(inputStream, "UTF-8");
	            inputStream.close();
	            ftpClient.completePendingCommand();
	            logger.info(log, "FTP工具", "从FTP获取String", "FtpUtil", "method", "downloadString", "从FTP获取String成功:" + this.ip + remoteFileName);	            
			
			} else {
			    throw new FtpException( "retrieveFileStream is null");
			}
				
		} catch (IOException e) {
		    
			throw new FtpException(e.getMessage());
			
		}
		
		logger.info(log, "FTP工具", "从FTP获取String", "FtpUtil", "method", "downloadString", "从FTP获取String结束:" + this.ip + remoteFileName);
		return result;
	}
	
	/**
	 * 获取远程路径下的所有文件名(选择性包括子文件夹)
	 * 
	 * @param remotePath
	 *            远程路径
	 * @param isAll
	 *            是否包含子文件夹
	 * @return List<String>
	 * @throws FtpException
	 */
	public List<String> getRemoteFileNameList(String remotePath, Boolean isAll) throws FtpException {
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		FTPFile[] ftpFiles;
		List<String> retList = new ArrayList<String>();
		try {
			ftpFiles = ftpClient.listFiles(remotePath);
			if (ftpFiles == null || ftpFiles.length == 0) {
				return retList;
			}
			for (FTPFile ftpFile : ftpFiles) {
				if (ftpFile.isDirectory() && !ftpFile.getName().startsWith(".") && isAll) {
					String subPath = remotePath + "/" + ftpFile.getName();
					for (String fileName : getRemoteFileNameList(subPath, true)) {
						retList.add(fileName);
					}
				} else if (ftpFile.isFile()) {
					retList.add(remotePath + "/" + ftpFile.getName());
				}
			}
		} catch (IOException e) {
			throw new FtpException( e.getMessage());
		}
		return retList;
	}

	/**
	 * 下载远程路径下的所有文件(选择性包括子文件夹)
	 * 
	 * @param remotePath
	 *            远程地址
	 * @param isAll
	 *            是否包含子文件夹
	 * @param localPath
	 *            本地存放路径
	 * @return
	 * @throws FtpException
	 */
	public boolean downloadFolder(String remotePath, Boolean isAll, String localPath) throws FtpException {
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		boolean result = false;
		List<String> fileNameList;
		fileNameList = getRemoteFileNameList(remotePath, isAll);
		for (String fileName : fileNameList) {
			String relativePath = fileName.substring(remotePath.length(), fileName.length());
			String localFileName = localPath + relativePath;
			result = downloadFile(localFileName, fileName);
		}
		return result;
	}

	/**
	 * 删除远程服务器上指定文件
	 * 
	 * @param remoteFileName
	 * @return
	 * @throws FtpException
	 */
	public boolean deleteFile(String remoteFileName) throws FtpException {
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		boolean result = false;
		try {
			result = this.ftpClient.deleteFile(remoteFileName);
			logger.info(log, "FTP工具", "从FTP删除文件", "FtpUtil", "method", "deleteFile", "从FTP删除文件成功:" + this.ip + remoteFileName);
		} catch (IOException e) {
			throw new FtpException( e.getMessage());
		}
		return result;
	}
	
	/**
	 * 删除远程服务器上指定文件夹(文件夹内一定要为空)
	 * 
	 * @param remoteFolderPath
	 * @throws FtpException
	 */
	public void deleteEmptyFolder(String remoteFolderPath) throws FtpException{
		if (!isPrepared) {
			throw new FtpException("对FTP操作前应先登录");
		}
		try {
			if (this.ftpClient.removeDirectory(remoteFolderPath)){
				logger.info(log, "FTP工具", "从FTP删除文件夹", "FtpUtil", "method", "deleteEmptyFolder", "从FTP删除文件夹成功:" + this.ip + remoteFolderPath);
			}else {
				throw new FtpException( "从FTP删除文件夹出错");
			}
		} catch (IOException e) {
			throw new FtpException( e.getMessage());
		}
	}
	
	/**
	 * 删除远程文件夹及其内的所有文件(包括子文件夹)
	 * 
	 * @param remoteFolderPath
	 * @throws FtpException
	 * @throws IOException
	 */
	public void deleteFolder(String remoteFolderPath) throws FtpException{
		if (!isPrepared) {
			throw new FtpException( "对FTP操作前应先登录");
		}
		FTPFile[] ftpFiles;
		try {
			ftpFiles = ftpClient.listFiles(remoteFolderPath);
			for (FTPFile ftpFile : ftpFiles) {
				if (ftpFile.isFile()) {
					deleteFile(remoteFolderPath + "/" + ftpFile.getName());
				}else if (ftpFile.isDirectory() && !ftpFile.getName().startsWith(".")){
					deleteFolder(remoteFolderPath + "/" + ftpFile.getName());
				}
			}
			deleteEmptyFolder(remoteFolderPath);
		} catch (IOException e) {
			throw new FtpException( e.getMessage());
		}
		
	}
	
	/**
	 * 检查远程路径是否存在,若不则递归创建文件夹
	 * 
	 * @param remotePath
	 * @throws FtpException
	 */
	private void checkAndCreateDirectory(String remotePath) throws FtpException{  
        String directory = remotePath.substring(0,remotePath.lastIndexOf("/")+1);  
        try {
			if(!directory.equalsIgnoreCase("/") &&! ftpClient.changeWorkingDirectory(directory)){  
			    int preLocation=0;  
			    int nextLocation = 0;  
			    if(directory.startsWith("/")) preLocation = 1;  
			    nextLocation = directory.indexOf("/",preLocation);  
			    while(nextLocation > preLocation){
			        String subDirectory = new String(remotePath.substring(preLocation,nextLocation));  
			        if(!ftpClient.changeWorkingDirectory(subDirectory)){  
			            if(ftpClient.makeDirectory(subDirectory)){  
			               ftpClient.changeWorkingDirectory(subDirectory);  
			            } 
			        }
			        preLocation = nextLocation + 1;  
			        nextLocation = directory.indexOf("/",preLocation);  
			    }  
			}
			 ftpClient.changeWorkingDirectory("/");
		} catch (IOException e) {
			throw new FtpException( e.getMessage());
		}
       
    }
	
	/**
	 * 获取本地文件夹下的所有文件名
	 * 
	 * @param localFolderPath
	 * @return
	 */
	public List<String> getLocalFileNameList(String localFolderPath) {
		File originalFile = new File(localFolderPath);
		File[] files = originalFile.listFiles();
		List<String> list = new ArrayList<String>();
		if (files == null || files.length == 0) {
			return list;
		}
		for (File file : files) {

			if (file.isDirectory()) {
				String subPath = localFolderPath + "/" + file.getName();
				for (String fileName : getLocalFileNameList(subPath)) {
					list.add(fileName);
				}
			} else if (file.isFile()) {
				list.add(file.getPath());
			}
		}
		return list;
	}
	
	/**
	 * ftp上传服务器的代码
	 * @param ftpFileLocaCfg 上传的文件配置,请看第一个方法
	 * @param filePath   上传的文件的路径地址
	 * @param fileName  上传的文件名称
	 * @return
	 */
	public boolean uploadFtpFile( String ftpFileLocaCfg, String filePath,String fileName){
		 boolean flag = false;
		 FileInputStream inputStream = null;
		 try {
		 //是否成功登录FTP服务器
		 int replyCode = ftpClient.getReplyCode();
		 //如果reply >= 200) && (reply < 300,表示没有保存成功
		 if(!FTPReply.isPositiveCompletion(replyCode)){
			 
		 return flag;
		 }
		 inputStream = new FileInputStream( new File(filePath));
		 ftpClient.enterLocalPassiveMode();
		 ftpClient.changeWorkingDirectory(ftpFileLocaCfg);
		 //保存文件
		 flag = ftpClient.storeFile(fileName, inputStream);
		 inputStream.close();
		 ftpClient.logout();
		 } catch (Exception e) {
		 e.printStackTrace();
		 } finally{
		 if(ftpClient.isConnected()){
		 try {
		 ftpClient.disconnect();
		 } catch (IOException e) {
		 e.printStackTrace();
		 }
		 }
		 }
		 return flag;
		 }
	
}





第三步:异常类配置


package bianliang.com;

public class FtpException  extends Exception{
	private static final long serialVersionUID = 3116679193767247127L;

	private String message;


	public FtpException( String message) {
		
		this.message=message;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

}





分享到:
评论

相关推荐

    实现android端用FTP上传文件功能

    以下将详细介绍如何在Android应用中实现FTP上传功能,并结合提供的资源进行讨论。 首先,我们需要理解FTP的基本原理。FTP是一种网络协议,用于在两台计算机之间传输文件。在Android应用中,我们通常使用Java的FTP...

    VB实现FTP上传文件功能

    可以实现文件上传功能,并能检索到FTP目前的目录

    Labview FTP上传文件

    Labview FTP上传文件是利用Labview(Laboratory Virtual Instrument Engineering Workbench)这一强大的图形化编程环境,通过FTP(File Transfer Protocol)协议实现文件的远程传输。FTP是一种标准网络协议,用于在...

    自用通过SSH安全端口代替FTP上传文件功能类似.zip

    标题中的“自用通过SSH安全端口代替FTP上传文件功能类似.zip”表明这是一个关于使用SSH(Secure Shell)协议来替代FTP(File Transfer Protocol)进行文件传输的方案。SSH是一种更安全的网络协议,用于在不安全的...

    C++ libcurl ftp上传文件

    FTP上传文件的核心在于`curl_easy_setopt()`函数,它可以设置各种选项来定制FTP请求。首先,设置URL为FTP服务器的地址: ```cpp curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/path/to/file"); ``` ...

    FTP上传文件

    在给定的代码示例中,我们详细探讨了如何使用Java编程语言实现FTP上传文件的功能。 ### 一、FTP上传文件的基本概念 FTP协议由两部分组成:控制连接和数据连接。控制连接用于发送命令和接收响应,而数据连接则用于...

    实现VB FTP上传文件

    使用`STOR`命令上传文件。首先,设置本地文件路径和FTP服务器上的目标路径,然后发送`STOR`命令: ```vb Dim localFilePath As String = "C:\local\file.txt" Dim remoteFilePath As String = "/public_...

    winfrom连接FTP上传文件

    下面是一个简单的FTP连接和上传文件的步骤: 1. **建立FTP连接**:创建一个`FtpWebRequest`对象,设置其`Method`属性为`WebMethod.UploadFile`,并指定FTP服务器的URL、用户名和密码。 ```csharp FtpWebRequest ...

    ftp批量上传文件bat

    实现FTP批量上传文件到指定目录功能的bat脚本: @echo off @echo delete iplist.txt @del iplist.txt @setlocal EnableDelayedExpansion @echo create upload iplist.... @for /L %%i in (51,1,52) do ( @echo ...

    实现Qt-FTP上传文件

    当FTP上传完成后,libcurl会触发一个信号,Qt的槽函数可以处理这个信号。这里,我们使用`QNetworkReply`的`finished`信号和一个槽函数: ```cpp // 创建一个槽函数处理FTP上传完成 void uploadFinished...

    springboot以FTP方式上传文件到远程服务器的流程

    Spring Boot 中使用 FTP 上传文件到远程服务器的流程 在本文中,我们将介绍如何使用 Spring Boot 实现 FTP 上传文件到远程服务器的流程。这个流程包括如何使用 JWT 登录认证及鉴权的流程,以及如何使用 Spring ...

    定时ftp上传文件

    在IT行业中,定时FTP上传文件是一项常见的自动化任务,尤其对于监控、数据分析或者备份等场景尤为重要。这个任务涉及到几个关键知识点,下面将详细讲解。 首先,我们要理解“定时”这一概念。在计算机领域,定时...

    Qt5.8用FTP实现文件上传和下载(带进度条)

    要实现FTP上传,我们首先需要建立一个FTP连接。这可以通过创建一个QNetworkAccessManager实例并调用其get或post方法完成。对于FTP,我们需要使用FTP URL,如“ftp://username:password@server:port/path”。然后,...

    3dMax脚本开发的FTP上传文件工具下载

    标题提到的“3dMax脚本开发的FTP上传文件工具”就是通过Maxscript编写的一个实用工具,它使得3DMax用户能够方便地将工作成果上传到FTP服务器。 FTP(File Transfer Protocol)是一种网络协议,用于在网络上进行文件...

    java实现的ftp文件上传

    Java作为多平台支持的编程语言,提供了丰富的库和API来实现FTP文件上传功能。本篇文章将详细探讨如何使用Java实现FTP文件上传,以及相关类的作用。 首先,我们来看标题和描述中的关键词"java实现的ftp文件上传",这...

    php处理ftp上传文件

    ### PHP处理FTP上传文件知识点详解 #### 一、利用PHP内置文件函数实现文件上传 **1.1 上传文件表单设计(upload.html)** 在实现文件上传功能时,首先需要设计一个表单用于接收用户的文件输入。在这个例子中,`...

    php实现通过ftp上传文件

    首先,我们需要理解FTP上传的基本原理。FTP是一种用于在网络上进行文件传输的应用层协议,它允许用户在两台计算机之间交换文件。在PHP中,我们可以使用`ftp_connect()`、`ftp_login()`等函数来建立连接,并通过`ftp_...

    asp.net利用ftp上传文件实现示例代码

    以下是一个简单的FTP上传文件的步骤: 1. **创建FtpWebRequest对象**:首先,我们需要创建一个`FtpWebRequest`实例,设置其`Method`属性为`WebRequestMethods.Ftp.UploadFile`,并指定FTP服务器的URL和文件路径。 ...

    Android 通过ftp上传文件获取上传速度及进度

    3. **文件上传**:使用`FTPClient`的`storeFile()`方法上传文件,并在此过程中计算上传速度和进度。首先,打开本地文件: ```java FileInputStream fis = new FileInputStream(localFilePath); ``` 然后,使用`...

    FTPUpload上传文件 进度条显示进度

    在Java编程环境中,FTP(File Transfer Protocol)上传文件并实现进度条显示是一个常见的需求,尤其在用户界面设计中。下面将详细讲解如何使用Java的Swing库创建一个带有进度条的FTP文件上传功能。 首先,我们需要...

Global site tag (gtag.js) - Google Analytics