`
happyqing
  • 浏览: 3197909 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

FTPClient工具类FtpUtil,连接、上传、下载、文件、目录

阅读更多

 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

/**
 * FTPClient工具类
 * @author happyqing
 * @since 2016.7.20
 */
public class FtpUtil {
	
	private static Logger log = Logger.getLogger(FtpUtil.class);
    private FTPClient ftp;

    public FtpUtil() {
        ftp = new FTPClient();
        ftp.setControlEncoding("UTF-8"); //解决上传文件时文件名乱码
    }
    
    public FtpUtil(String controlEncoding) {
        ftp = new FTPClient();
        ftp.setControlEncoding(controlEncoding); //解决上传文件时文件名乱码
    }
    
    public void setTimeOut(int defaultTimeoutSecond, int connectTimeoutSecond, int dataTimeoutSecond){
        try {
			ftp.setDefaultTimeout(defaultTimeoutSecond * 1000);
			//ftp.setConnectTimeout(connectTimeoutSecond * 1000); //commons-net-3.5.jar
			ftp.setSoTimeout(connectTimeoutSecond * 1000); //commons-net-1.4.1.jar 连接后才能设置
			ftp.setDataTimeout(dataTimeoutSecond * 1000);
		} catch (SocketException e) {
			log.error("setTimeout Exception:", e);
		}
    }
    
    public FTPClient getFTPClient(){
    	return ftp;
    }
    
    public void setControlEncoding(String charset){
    	ftp.setControlEncoding(charset);
    }
    
    public void setFileType(int fileType) throws IOException {
    	ftp.setFileType(fileType);
    }

    /**
     * Connect to FTP server.
     * 
     * @param host
     *            FTP server address or name
     * @param port
     *            FTP server port
     * @param user
     *            user name
     * @param password
     *            user password
     * @throws IOException
     *             on I/O errors
     */
    public FTPClient connect(String host, int port, String user, String password) throws IOException {
        // Connect to server.
        try {
            ftp.connect(host, port);
        } catch (UnknownHostException ex) {
            throw new IOException("Can't find FTP server '" + host + "'");
        }

        // Check rsponse after connection attempt.
        int reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            disconnect();
            throw new IOException("Can't connect to server '" + host + "'");
        }

        if ("".equals(user)) {
            user = "anonymous";
        }

        // Login.
        if (!ftp.login(user, password)) {
        	disconnect();
            throw new IOException("Can't login to server '" + host + "'");
        }

        // Set data transfer mode.
        ftp.setFileType(FTP.BINARY_FILE_TYPE);
        //ftp.setFileType(FTP.ASCII_FILE_TYPE);
        
        // Use passive mode to pass firewalls.
        ftp.enterLocalPassiveMode();
        
        return ftp;
    }
    
    /**
     * Test connection to ftp server
     * 
     * @return true, if connected
     */
    public boolean isConnected() {
        return ftp.isConnected();
    }
    
    /**
     * Disconnect from the FTP server
     * 
     * @throws IOException
     *             on I/O errors
     */
    public void disconnect() throws IOException {

        if (ftp.isConnected()) {
            try {
                ftp.logout();
                ftp.disconnect();
            } catch (IOException ex) {
            }
        }
    }
    
    /**
     * Get file from ftp server into given output stream
     * 
     * @param ftpFileName
     *            file name on ftp server
     * @param out
     *            OutputStream
     * @throws IOException
     */
    public void retrieveFile(String ftpFileName, OutputStream out) throws IOException {
        try {
            // Get file info.
            FTPFile[] fileInfoArray = ftp.listFiles(ftpFileName);
            if (fileInfoArray == null || fileInfoArray.length == 0) {
                throw new FileNotFoundException("File '" + ftpFileName + "' was not found on FTP server.");
            }

            // Check file size.
            FTPFile fileInfo = fileInfoArray[0];
            long size = fileInfo.getSize();
            if (size > Integer.MAX_VALUE) {
                throw new IOException("File '" + ftpFileName + "' is too large.");
            }

            // Download file.
            if (!ftp.retrieveFile(ftpFileName, out)) {
                throw new IOException("Error loading file '" + ftpFileName + "' from FTP server. Check FTP permissions and path.");
            }

            out.flush();

        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException ex) {
                }
            }
        }
    }

    /**
     * Put file on ftp server from given input stream
     * 
     * @param ftpFileName
     *            file name on ftp server
     * @param in
     *            InputStream
     * @throws IOException
     */
    public void storeFile(String ftpFileName, InputStream in) throws IOException {
        try {
            if (!ftp.storeFile(ftpFileName, in)) {
                throw new IOException("Can't upload file '" + ftpFileName + "' to FTP server. Check FTP permissions and path.");
            }
        } finally {
            try {
                in.close();
            } catch (IOException ex) {
            }
        }
    }
    
    /**
     * 修改名称
     * @param from
     * @param to
     * @throws IOException
     */
    public boolean rename(String from, String to) throws IOException {
    	return ftp.rename(from, to);
    }
    
    /**
     * Delete the file from the FTP server.
     * 
     * @param ftpFileName
     *            server file name (with absolute path)
     * @throws IOException
     *             on I/O errors
     */
    public void deleteFile(String ftpFileName) throws IOException {
        if (!ftp.deleteFile(ftpFileName)) {
            throw new IOException("Can't remove file '" + ftpFileName + "' from FTP server.");
        }
    }

    /**
     * Upload the file to the FTP server.
     * 
     * @param ftpFileName
     *            server file name (with absolute path)
     * @param localFile
     *            local file to upload
     * @throws IOException
     *             on I/O errors
     */
    public void upload(String ftpFileName, File localFile) throws IOException {
        // File check.
        if (!localFile.exists()) {
            throw new IOException("Can't upload '" + localFile.getAbsolutePath() + "'. This file doesn't exist.");
        }

        // Upload.
        InputStream in = null;
        try {
            in = new BufferedInputStream(new FileInputStream(localFile));
            if (!ftp.storeFile(ftpFileName, in)) {
                throw new IOException("Can't upload file '" + ftpFileName + "' to FTP server. Check FTP permissions and path.");
            }

        } finally {
            try {
                in.close();
            } catch (IOException ex) {
            }
        }
    }
    
    /**
	 * 上传目录(会覆盖)
	 * @param remotePath 远程目录 /home/test/a
	 * @param localPath 本地目录 D:/test/a
	 * @throws IOException
	 */
	public void uploadDir(String remotePath, String localPath) throws IOException {
		File file = new File(localPath);
		if (file.exists()) {
			if(!ftp.changeWorkingDirectory(remotePath)){
				ftp.makeDirectory(remotePath);	//创建成功返回true,失败(已存在)返回false
				ftp.changeWorkingDirectory(remotePath);	//切换成返回true,失败(不存在)返回false
			}
			File[] files = file.listFiles();
			for (File f : files) {
				if (f.isDirectory() && !f.getName().equals(".") && !f.getName().equals("..")) {
					uploadDir(remotePath + "/" + f.getName(), f.getPath());
				} else if (f.isFile()) {
					upload(remotePath + "/" + f.getName(), f);
				}
			}
		}
	}

    /**
     * Download the file from the FTP server.
     * 
     * @param ftpFileName
     *            server file name (with absolute path)
     * @param localFile
     *            local file to download into
     * @throws IOException
     *             on I/O errors
     */
    public void download(String ftpFileName, File localFile) throws IOException {
        // Download.
        OutputStream out = null;
        try {
            // Get file info.
            FTPFile[] fileInfoArray = ftp.listFiles(ftpFileName);
            if (fileInfoArray == null || fileInfoArray.length == 0) {
                throw new FileNotFoundException("File " + ftpFileName + " was not found on FTP server.");
            }

            // Check file size.
            FTPFile fileInfo = fileInfoArray[0];
            long size = fileInfo.getSize();
            if (size > Integer.MAX_VALUE) {
                throw new IOException("File " + ftpFileName + " is too large.");
            }

            // Download file.
            out = new BufferedOutputStream(new FileOutputStream(localFile));
            if (!ftp.retrieveFile(ftpFileName, out)) {
                throw new IOException("Error loading file " + ftpFileName + " from FTP server. Check FTP permissions and path.");
            }

            out.flush();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException ex) {
                }
            }
        }
    }
    
	/**
	 * 下载目录(会覆盖)
	 * @param remotePath 远程目录 /home/test/a
	 * @param localPath 本地目录 D:/test/a
	 * @return
	 * @throws IOException
	 */
    public void downloadDir(String remotePath, String localPath) throws IOException {
    	File file = new File(localPath);
    	if(!file.exists()){
    		file.mkdirs();
    	}
    	FTPFile[] ftpFiles = ftp.listFiles(remotePath);
        for (int i = 0; ftpFiles!=null && i<ftpFiles.length; i++) {
        	FTPFile ftpFile = ftpFiles[i];
        	if (ftpFile.isDirectory() && !ftpFile.getName().equals(".") && !ftpFile.getName().equals("..")) {
        		downloadDir(remotePath + "/" + ftpFile.getName(), localPath + "/" + ftpFile.getName());
			} else {
	        	download(remotePath + "/" + ftpFile.getName(), new File(localPath + "/" + ftpFile.getName()));
			}
        }
    }

    /**
     * List the file name in the given FTP directory.
     * 
     * @param filePath
     *            absolute path on the server
     * @return files relative names list
     * @throws IOException
     *             on I/O errors
     */
    public List<String> listFileNames(String filePath) throws IOException {
        List<String> fileList = new ArrayList<String>();

        FTPFile[] ftpFiles = ftp.listFiles(filePath);
        for (int i = 0; ftpFiles!=null && i<ftpFiles.length; i++) {
            FTPFile ftpFile = ftpFiles[i];
            if (ftpFile.isFile()) {
                fileList.add(ftpFile.getName());
            }
        }
        
        return fileList;
    }
    
    /**
     * List the files in the given FTP directory.
     * 
     * @param filePath
     *            directory
     * @return list
     * @throws IOException
     */
    public List<FTPFile> listFiles(String filePath) throws IOException {
        List<FTPFile> fileList = new ArrayList<FTPFile>();

        FTPFile[] ftpFiles = ftp.listFiles(filePath);
        for (int i = 0; ftpFiles!=null && i<ftpFiles.length; i++) {
            FTPFile ftpFile = ftpFiles[i];
//            FfpFileInfo fi = new FfpFileInfo();
//            fi.setName(ftpFile.getName());
//            fi.setSize(ftpFile.getSize());
//            fi.setTimestamp(ftpFile.getTimestamp());
//            fi.setType(ftpFile.isDirectory());
            fileList.add(ftpFile);
        }

        return fileList;
    }


    /**
     * Send an FTP Server site specific command
     * 
     * @param args
     *            site command arguments
     * @throws IOException
     *             on I/O errors
     */
    public void sendSiteCommand(String args) throws IOException {
        if (ftp.isConnected()) {
            try {
                ftp.sendSiteCommand(args);
            } catch (IOException ex) {
            }
        }
    }

    /**
     * Get current directory on ftp server
     * 
     * @return current directory
     */
    public String printWorkingDirectory() {
        if (!ftp.isConnected()) {
            return "";
        }

        try {
            return ftp.printWorkingDirectory();
        } catch (IOException e) {
        }

        return "";
    }

    /**
     * Set working directory on ftp server
     * 
     * @param dir
     *            new working directory
     * @return true, if working directory changed
     */
    public boolean changeWorkingDirectory(String dir) {
        if (!ftp.isConnected()) {
            return false;
        }

        try {
            return ftp.changeWorkingDirectory(dir);
        } catch (IOException e) {
        }

        return false;
    }

    /**
     * Change working directory on ftp server to parent directory
     * 
     * @return true, if working directory changed
     */
    public boolean changeToParentDirectory() {
        if (!ftp.isConnected()) {
            return false;
        }

        try {
            return ftp.changeToParentDirectory();
        } catch (IOException e) {
        }

        return false;
    }

    /**
     * Get parent directory name on ftp server
     * 
     * @return parent directory
     */
    public String printParentDirectory() {
        if (!ftp.isConnected()) {
            return "";
        }

        String w = printWorkingDirectory();
        changeToParentDirectory();
        String p = printWorkingDirectory();
        changeWorkingDirectory(w);

        return p;
    }
    
    /**
     * 创建目录
     * @param pathname
     * @throws IOException
     */
    public boolean makeDirectory(String pathname) throws IOException {
    	return ftp.makeDirectory(pathname);
    }
	
	public static void main(String[] args) throws Exception {
		FtpUtil ftpUtil = new FtpUtil("UTF-8");
		ftpUtil.connect("1.2.3.4", 21, "testuser", "testuser");
		//ftpUtil.setTimeOut(60, 60, 60);
		ftpUtil.upload("/home/testuser/文件1.txt", new File("E:/image/FTPClient/FTPClient测试/文件1.txt"));
		ftpUtil.download("/home/testuser/文件1.txt", new File("E:/image/FTPClient/FTPClient测试/文件1.txt"));
		ftpUtil.uploadDir("/home/testuser/FTPClient测试", "E:/image/FTPClient/FTPClient测试");
		ftpUtil.downloadDir("/home/testuser/FTPClient测试", "E:/image/FTPClient/FTPClient测试");
		
		ByteArrayOutputStream bos = new ByteArrayOutputStream(); //自动增长
		ftpUtil.retrieveFile("/home/testuser/文件1.txt", bos);
		System.out.println(bos.size());
		String contentStr = new String(bos.toByteArray(),"GBK");
		System.out.println(contentStr);
		ftpUtil.disconnect();
	} 

}

 

参考:

Apache FTPClient操作“卡死”问题的分析和解决
http://www.cnblogs.com/CopyPaster/p/3494579.html

Ftp相关
http://www.cnblogs.com/meieiem/archive/2012/04/26/2470863.html

 

分享到:
评论

相关推荐

    基于springboot的FtpUtil工具类.zip

    FtpUtil是为简化FTP操作而编写的实用工具类,它封装了连接、登录、文件操作等常用方法。例如,`connectToFtpServer`方法用于建立与FTP服务器的连接,`login`方法用于用户认证,`uploadFile`和`downloadFile`方法则...

    java版ftp上传下载工具类

    例如,`FTPClient.connect()` 和 `FTPClient.login()` 将分别用于建立连接和登录,而上传和下载文件则会使用 `FTPClient.storeFile()` 和 `FTPClient.retrieveFile()` 方法。 在使用这个工具类时,开发者只需调用...

    apache FTP 工具类

    通过这个类,我们可以连接到FTP服务器,执行登录、创建/删除目录、上传/下载文件、改变工作目录等一系列操作。 **2. 连接与登录** 在使用FTPClient进行任何操作之前,需要先建立连接并登录。这通常涉及以下步骤: ...

    FtpUtil.java

    它提供了便捷的方法来连接FTP服务器,上传、下载文件以及进行其他与FTP相关的任务。本文将深入解析FTPUtil.java的核心功能和实现原理,帮助开发者更好地理解和使用这个工具类。 首先,FTPUtil.java通常包含以下关键...

    FtpUtil工具类

    淘淘商城FtpUtil工具类 , 使用java代码访问ftp服务器 使用apache的FTPClient工具访问ftp服务器

    springboot-FtpUtil-master_springbootftputil_ftp_attentioniwd_DEM

    2. **FTP工具类**:`FtpUtil`是核心工具类,它包含了一系列静态方法,如`connect()`用于建立连接,`uploadFile()`和`downloadFile()`分别用于文件上传和下载,以及`disconnect()`用于关闭连接。这些方法内部会使用`...

    FTPUtil.vb 利用Socket 实现FTP文件上传和文件下载

    3. **FTP命令与响应**:FTPUtil.vb需要实现一系列FTP命令,如`USER`(用户登录)、`PASS`(密码验证)、`CWD`(改变工作目录)、`PASV`(在被动模式下启动数据连接)、`STOR`(上传文件)、`RETR`(下载文件)等。...

    ftputil.rar

    这个工具可能包含了一个名为`ftputil`的Java类,该类提供了连接FTP服务器、登录、切换目录、列出文件、下载文件等功能。开发者可以通过调用这个类的方法来实现FTP操作。例如,可能有一个`listJavaFiles(String ...

    FTP文件上传

    首先,`FtpUtil.java`通常是一个封装了FTP操作的工具类,包括连接、登录、上传文件、断开连接等方法。在`FtpUtil`中,你需要导入Apache Commons Net库,它提供了丰富的FTP操作API。`commons-net-1.2.2.jar`是这个库...

    Java FTP文件上传下载

    `FtpUtil.java`很可能是一个封装了FTP操作的类,包括连接FTP服务器、登录、设置工作目录、上传文件、下载文件、断开连接等方法。这些方法通过调用Java的`java.net.Socket`类和`commons-net-1.4.1.jar`库中的FTP相关...

    FTPUtil_ftp_

    FTPUtil_ftp_ 是一个基于Java编程语言实现的FTP客户端工具类,主要用于处理FTP(File Transfer Protocol)相关的操作,如上传文件、下载文件以及批量上传和下载。在IT行业中,FTP是一个广泛使用的协议,用于在计算机...

    JAVA操作FTP文件服务器上传与下载文件

    7. **下载文件**: 对于文件下载,可以使用`retrieveFile(String remoteFile, OutputStream localFile)`。`remoteFile`是服务器上的文件名,`localFile`则为本地文件的输出流。 8. **断开连接**: 完成所有操作后...

    java实现上传和下载工具类

    Java实现上传和下载工具类是指使用Java语言实现的文件上传和下载功能,通过使用FTP(File Transfer Protocol)协议将文件上传到FTP服务器或从FTP服务器下载文件。下面将详细介绍Java实现上传和下载工具类的知识点。...

    java实现ftp文件上传及下载源码

    在提供的源码中,可能会包含JUnit或TestNG等测试框架的测试类,用于模拟不同场景下的FTP操作,比如连接测试、上传下载文件的正确性等。 综上所述,这个资源包提供了一个完整的Java FTP客户端实现,包括连接服务器、...

    FTP上传下载工具

    在这个“FTP上传下载工具”中,开发者使用Java语言构建了一个功能强大的客户端应用,它能够实现文件和文件夹的上传与下载,并且带有进度显示,极大地提高了用户在处理大文件时的体验。 1. **Java FTP库**: 这个...

    java应用ftp操作文件

    9. **FtpUtil.java**:这个文件很可能包含了使用Apache Commons Net库进行FTP操作的实用工具类或方法,如连接、上传、下载的抽象封装。 通过上述知识点,我们可以了解到Java中进行FTP操作的基本原理和方法,以及...

    javaftp实现上传下载解决编码问题.doc

    在实际使用中,我们需要创建一个`FtpUtil`工具类来处理FTP的相关操作,如登录、上传和下载。`FtpUtil`类通常会包含以下方法: ```java public class FtpUtil { // 初始化字段,包括服务器IP、用户名、密码、路径、...

    FtpServer 附带java代码上传下载FTP代码例子

    FTPUtil.java 是一个实用工具类,它封装了FTP相关的操作,如连接、登录、文件上传和下载等功能。这个类通常会包含以下关键知识点: 1. **FTP连接**:使用`org.apache.commons.net.ftp.FTPClient`类建立与FTP服务器...

    Java的FTP任务代码实例

    注意,`FTPClient`类提供了丰富的API,包括上传文件、下载文件、删除文件、创建目录、切换目录等功能。你可以根据实际需求在`FtpUtil`类中扩展这些功能。 例如,要上传一个文件到FTP服务器,可以添加如下方法: ``...

Global site tag (gtag.js) - Google Analytics