package com.kl.print.util;apache import java.io.ByteArrayOutputStream; 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 org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply;工具 /** * ftp上傳下載工具類 * @author wangn * @date 2018年01月30日 * @version 1.0 */ public class FtpUtils { private final static Log logger = LogFactory.getLog(FtpUtils.class); private static FTPClient ftp; public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) { FTPClient ftpClient = new FTPClient(); try { ftpClient = new FTPClient(); ftpClient.connect(ftpHost, ftpPort);// 鏈接FTP服務器 ftpClient.login(ftpUserName, ftpPassword);// 登錄FTP服務器 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { logger.info("未鏈接到FTP,用戶名或密碼錯誤。"); ftpClient.disconnect(); } else { logger.info("FTP鏈接成功。"); } } catch (SocketException e) { e.printStackTrace(); logger.info("FTP的IP地址可能錯誤,請正確配置。"); } catch (IOException e) { e.printStackTrace(); logger.info("FTP的端口錯誤,請正確配置。"); } return ftpClient; } /** * Description: 向FTP服務器上傳文件 * @param host FTP服務器hostname * @param port FTP服務器端口 * @param username FTP登陸帳號 * @param password FTP登陸密碼 * @param filePath FTP服務器文件存放路徑。 * @param filename 上傳到FTP服務器上的文件名 * @param input 輸入流 * @return 成功返回true,不然返回false */ public static boolean uploadFile(String host, int port, String username, String password, String filePath,String path, String filename, InputStream input) { boolean result = false; FTPClient ftp = new FTPClient(); try { int reply; ftp.connect(host, port);// 鏈接FTP服務器 // 若是採用默認端口,能夠使用ftp.connect(host)的方式直接鏈接FTP服務器 ftp.enterLocalPassiveMode(); ftp.login(username, password);// 登陸 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return result; } //設置上傳文件的類型爲二進制類型 ftp.setFileType(FTP.BINARY_FILE_TYPE); ftp.cwd("/"); path = path.replaceAll("\\\\", "/"); String[] paths = path.split("/"); for (int i = 0; i < paths.length; i++) { String pathTemp = paths[i]; /* 建立的是父子目錄 */ if(!ftp.makeDirectory(pathTemp)) { System.out.println("---建立目錄失敗--"); } ftp.changeWorkingDirectory(pathTemp); /* 進入到該目錄 */ /*ftp.cwd(pathTemp); System.out.println("ftp.cwd(pathTemp)"+ ftp.cwd(pathTemp)); ftp.storeFile(filename, input);*/ } return ftp.storeFile(filename, input); //上傳文件 // ftp.makeDirectory(path); /* if (!ftp.storeFile(filename, input)) { return result; } input.close(); ftp.logout(); result = true; */ } catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } } return result; } /* * 從FTP服務器下載文件 * * @param ftpHost FTP IP地址 * * @param ftpPassword FTP用戶名密碼 * * @param ftpPort FTP端口 * * @param ftpPath FTP服務器中文件所在路徑 格式: ftptest/aa * * @param localPath 下載到本地的位置 格式:H:/download * * @param fileName 文件名稱 */ public static OutputStream downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String fileName) { FTPClient ftpClient = null; OutputStream os=null; try { ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort); ftpClient.setControlEncoding("UTF-8"); // 中文支持 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); ftpClient.changeWorkingDirectory(ftpPath); /*File localFile = new File(localPath + File.separatorChar + fileName); 判斷目錄是否存在,不存在的話建立(父目錄) if(!localFile.getParentFile().exists()){ localFile.getParentFile().mkdirs(); }*/ os = new FileOutputStream(fileName); ftpClient.retrieveFile(fileName, os); os.close(); ftpClient.logout(); return os; } catch (FileNotFoundException e) { logger.error("沒有找到" + ftpPath + "文件"); e.printStackTrace(); } catch (SocketException e) { logger.error("鏈接FTP失敗."); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); logger.error("文件讀取錯誤。"); e.printStackTrace(); } return null; } spa /** * @param ip * @param port * @param userName * @param userPwd * @param path * @throws SocketException * @throws IOException function:鏈接到服務器 */ public static OutputStream downloadFile(String ip, int port, String userName, String userPwd, String path,String fileName) { ftp = new FTPClient(); ByteArrayOutputStream swapStream =null; try { // 鏈接 ftp.connect(ip, port); // 登陸 ftp.login(userName, userPwd); if (path != null && path.length() > 0) { //System.out.println("path:"+path); // 跳轉到指定目錄 ftp.changeWorkingDirectory(path); InputStream ins = null; try { ins = ftp.retrieveFileStream(fileName); // System.out.println("ins:"+ins.available()); swapStream= new ByteArrayOutputStream(); int ch; while ((ch = ins.read()) != -1) { swapStream.write(ch); } // System.out.println("swapStream:"+swapStream.size()); if(ins != null){ ins.close(); } // 主動調用一次getReply()把接下來的226消費掉. 這樣作是能夠解決這個返回null問題 ftp.getReply(); } catch (IOException e) { e.printStackTrace(); } } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { FtpUtils.closeServer(); } return swapStream; }.net /** * @throws IOException function:關閉鏈接 */ public static void closeServer() { if (ftp.isConnected()) { try { ftp.logout(); ftp.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws Exception { /*String ftpHost = "192.168.0.85"; String ftpUserName = "icbc"; String ftpPassword = "evhAB6#5"; int ftpPort = 21; String ftpPath = "/data/ftp/icbc/2017/02/10"; //String localPath = "D:/dd/bb"; String fileName="1708041358198180SW01.pdf";*/ //讀取文件的名稱,能夠經過給定字段進行查詢文件 //FtpUtils.downloadFtpFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, fileName); // File localFile = new File(localPath + File.separatorChar + fileName); /* 判斷目錄是否存在,不存在的話建立(父目錄) */ String fileName="1708041358198180SW03.pdf"; String ip = "192.168.0.85"; // 服務器IP地址 String userName = "*******"; // 用戶名 String userPwd = "*********"; // 密碼 int port = 21; // 端口號 String path = "/2018/02/12"; // 讀取文件的存放目錄 OutputStream outputStream= FtpUtils.downloadFile(ip, port, userName, userPwd, path,fileName); System.out.println("文件內容爲:"+outputStream.toString()); } } ip |