import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import org.apache.commons.net.ftp.FTPClient; import org.testng.annotations.Test; /** * 〈一句话功能简述〉<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class TestFtpClient { /** * * 上传文件到FTP <br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ @Test public void testUploadFileToFtp() throws Exception { // 获取本地文件对应的输入流 InputStream inputStream = new FileInputStream(new File( "D:/software/数据库学习资料/03-业务培训(第三阶段)/业务练习/满意度统计报表/相关脚本.sql")); // 连接到Ftp FTPClient ftpClient = FtpClientUtils.connectFtp("10.87.14.51", 21, "test", "test"); // 上传文件到FTP FtpClientUtils.uploadFileByInputStream("luxiaofeng/b", new String("相关脚本.sql".getBytes("GBK"), "ISO-8859-1"), inputStream, ftpClient); // 关闭连接 ftpClient.disconnect(); // 关闭输入流 inputStream.close(); } }
import java.io.IOException; import java.io.InputStream; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import com.suning.ids.client.util.StringUtils; /** * FTP操作的工具类<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class FtpClientUtils { /** * * 功能描述: <br> * 〈功能详细描述〉 * * @param directory * @param ftpClient * @return * @throws IOException * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static boolean createDirecroty(String directory, FTPClient ftpClient) throws Exception { // 首先判断目录是否存在 if (ftpClient.changeWorkingDirectory(directory)) { return true; } String[] dirs = directory.split("/"); for (String dir : dirs) { if (StringUtils.isNotEmpty(dir)) { // 如果目录不存在,则创建该目录 if (!ftpClient.changeWorkingDirectory(dir)) { if (ftpClient.makeDirectory(dir)) { ftpClient.changeWorkingDirectory(dir); } else { return false; } } } } return true; } /** * * 连接到FTP <br> * 〈功能详细描述〉 * * @param host * @param port * @param username * @param password * @throws Exception * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static FTPClient connectFtp(String host, int port, String username, String password) throws Exception { FTPClient ftpClient = new FTPClient(); ftpClient.connect(host, port); ftpClient.login(username, password); // 每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据,防止端口没有开启出现阻塞 ftpClient.enterLocalPassiveMode(); // 设置文件传输为二进制传输,默认为ASCII,二进制传输不会对文件内容作任何处理 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); return ftpClient; } /** * * 上传文件到FTP通过输入流的方式 <br> * 〈功能详细描述〉 * * @param ftpClient * @param savePath * @param fileName * @param inputStream * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static void uploadFileByInputStream(String savePath, String fileName, InputStream inputStream, FTPClient ftpClient) throws Exception { // 创建上传的目录,存在则切换到该目录,不存在则创建该目录 if (createDirecroty(savePath, ftpClient)) { ftpClient.storeFile(fileName, inputStream); } } /** * * 从FTP下载文件到本地 <br> * 〈功能详细描述〉 * * @param remoteDir:远程文件目录 * @param remteFileName:远程文件名 * @param localFile:本地文件路径 * @param ftpClient:FTPClient * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static void downloadFtpFile2Local(String remoteDir, String remteFileName, String localFile, FTPClient ftpClient) { FileOutputStream fos = null; // 首先判断远程文件目录是否存在 try { if (ftpClient.changeWorkingDirectory(remoteDir)) { fos = new FileOutputStream(localFile); // 如果当前的文件类型(ftpClient.setFileType)是ASCII,行分隔符将转化为本地的格式 ftpClient.retrieveFile(new String(remteFileName.getBytes("GBK"), "ISO-8859-1"), fos); } } catch (Exception e) { //日志 } finally { // 关闭FTP连接 if (ftpClient != null) { try { ftpClient.disconnect(); } catch (IOException e) { //日志 } } // 关闭输出流 if (fos != null) { try { fos.close(); } catch (IOException e) { //日志 } } } } }