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
相关推荐
FtpUtil是为简化FTP操作而编写的实用工具类,它封装了连接、登录、文件操作等常用方法。例如,`connectToFtpServer`方法用于建立与FTP服务器的连接,`login`方法用于用户认证,`uploadFile`和`downloadFile`方法则...
例如,`FTPClient.connect()` 和 `FTPClient.login()` 将分别用于建立连接和登录,而上传和下载文件则会使用 `FTPClient.storeFile()` 和 `FTPClient.retrieveFile()` 方法。 在使用这个工具类时,开发者只需调用...
通过这个类,我们可以连接到FTP服务器,执行登录、创建/删除目录、上传/下载文件、改变工作目录等一系列操作。 **2. 连接与登录** 在使用FTPClient进行任何操作之前,需要先建立连接并登录。这通常涉及以下步骤: ...
它提供了便捷的方法来连接FTP服务器,上传、下载文件以及进行其他与FTP相关的任务。本文将深入解析FTPUtil.java的核心功能和实现原理,帮助开发者更好地理解和使用这个工具类。 首先,FTPUtil.java通常包含以下关键...
淘淘商城FtpUtil工具类 , 使用java代码访问ftp服务器 使用apache的FTPClient工具访问ftp服务器
2. **FTP工具类**:`FtpUtil`是核心工具类,它包含了一系列静态方法,如`connect()`用于建立连接,`uploadFile()`和`downloadFile()`分别用于文件上传和下载,以及`disconnect()`用于关闭连接。这些方法内部会使用`...
3. **FTP命令与响应**:FTPUtil.vb需要实现一系列FTP命令,如`USER`(用户登录)、`PASS`(密码验证)、`CWD`(改变工作目录)、`PASV`(在被动模式下启动数据连接)、`STOR`(上传文件)、`RETR`(下载文件)等。...
这个工具可能包含了一个名为`ftputil`的Java类,该类提供了连接FTP服务器、登录、切换目录、列出文件、下载文件等功能。开发者可以通过调用这个类的方法来实现FTP操作。例如,可能有一个`listJavaFiles(String ...
首先,`FtpUtil.java`通常是一个封装了FTP操作的工具类,包括连接、登录、上传文件、断开连接等方法。在`FtpUtil`中,你需要导入Apache Commons Net库,它提供了丰富的FTP操作API。`commons-net-1.2.2.jar`是这个库...
`FtpUtil.java`很可能是一个封装了FTP操作的类,包括连接FTP服务器、登录、设置工作目录、上传文件、下载文件、断开连接等方法。这些方法通过调用Java的`java.net.Socket`类和`commons-net-1.4.1.jar`库中的FTP相关...
FTPUtil_ftp_ 是一个基于Java编程语言实现的FTP客户端工具类,主要用于处理FTP(File Transfer Protocol)相关的操作,如上传文件、下载文件以及批量上传和下载。在IT行业中,FTP是一个广泛使用的协议,用于在计算机...
7. **下载文件**: 对于文件下载,可以使用`retrieveFile(String remoteFile, OutputStream localFile)`。`remoteFile`是服务器上的文件名,`localFile`则为本地文件的输出流。 8. **断开连接**: 完成所有操作后...
Java实现上传和下载工具类是指使用Java语言实现的文件上传和下载功能,通过使用FTP(File Transfer Protocol)协议将文件上传到FTP服务器或从FTP服务器下载文件。下面将详细介绍Java实现上传和下载工具类的知识点。...
在提供的源码中,可能会包含JUnit或TestNG等测试框架的测试类,用于模拟不同场景下的FTP操作,比如连接测试、上传下载文件的正确性等。 综上所述,这个资源包提供了一个完整的Java FTP客户端实现,包括连接服务器、...
在这个“FTP上传下载工具”中,开发者使用Java语言构建了一个功能强大的客户端应用,它能够实现文件和文件夹的上传与下载,并且带有进度显示,极大地提高了用户在处理大文件时的体验。 1. **Java FTP库**: 这个...
9. **FtpUtil.java**:这个文件很可能包含了使用Apache Commons Net库进行FTP操作的实用工具类或方法,如连接、上传、下载的抽象封装。 通过上述知识点,我们可以了解到Java中进行FTP操作的基本原理和方法,以及...
在实际使用中,我们需要创建一个`FtpUtil`工具类来处理FTP的相关操作,如登录、上传和下载。`FtpUtil`类通常会包含以下方法: ```java public class FtpUtil { // 初始化字段,包括服务器IP、用户名、密码、路径、...
FTPUtil.java 是一个实用工具类,它封装了FTP相关的操作,如连接、登录、文件上传和下载等功能。这个类通常会包含以下关键知识点: 1. **FTP连接**:使用`org.apache.commons.net.ftp.FTPClient`类建立与FTP服务器...
注意,`FTPClient`类提供了丰富的API,包括上传文件、下载文件、删除文件、创建目录、切换目录等功能。你可以根据实际需求在`FtpUtil`类中扩展这些功能。 例如,要上传一个文件到FTP服务器,可以添加如下方法: ``...