1、在目標服務器上搭建FTP服務器
搭建方式有多種大家可以自行選擇,例如使用Serv-U或者FTPServer.exe;這里我以FTPServer.exe為例搭建;在目標服務器(這里對應的IP是10.8.66.22)上運行FTPServer.exe並按照下圖設置:
2、項目確保導入相應jar包:
apache的commons-net包:
maven項目導入下面的依賴即可:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.6</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency>
3、編寫FTP工具類:
新建類名為FTPUtils的class,並將下面所有的代碼黏貼進去:
package com.springboot.cache.springbootcache.utiles; 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.util.UUID; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; /** * FTP服務器工具類 */ public class FTPUtils { /** * 上傳文件至FTP服務器 * * @param url 服務器IP地址 * @param port 服務器端口 * @param userName 用戶登錄名 * @param password 用戶登錄密碼 * @param storePath 服務器文件存儲路徑 * @param fileName 服務器文件存儲名稱 * @param is 文件輸入流 * @return <b>true</b>:上傳成功 * <br/> * <b>false</b>:上傳失敗 */ public static boolean storeFile(String url, int port, String userName, String password, String storePath, String fileName, InputStream is) { boolean result = false; FTPClient ftp = new FTPClient(); try { // 連接至服務器,端口默認為21時,可直接通過URL連接 ftp.connect(url, port); // 登錄服務器 ftp.login(userName, password); // 判斷返回碼是否合法 if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { // 不合法時斷開連接 ftp.disconnect(); // 結束程序 return result; } // 判斷ftp目錄是否存在,如果不存在則創建目錄,包括創建多級目錄 String s = "/" + storePath; String[] dirs = s.split("/"); ftp.changeWorkingDirectory("/"); //按順序檢查目錄是否存在,不存在則創建目錄 for (int i = 1; dirs != null && i < dirs.length; i++) { if (!ftp.changeWorkingDirectory(dirs[i])) { if (ftp.makeDirectory(dirs[i])) { if (!ftp.changeWorkingDirectory(dirs[i])) { return false; } } else { return false; } } } // 設置文件操作目錄 ftp.changeWorkingDirectory(storePath); // 設置文件類型,二進制 ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 設置緩沖區大小 ftp.setBufferSize(3072); // 上傳文件 result = ftp.storeFile(fileName, is); // 關閉輸入流 is.close(); // 登出服務器 ftp.logout(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 判斷輸入流是否存在 if (null != is) { // 關閉輸入流 is.close(); } // 判斷連接是否存在 if (ftp.isConnected()) { // 斷開連接 ftp.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 從FTP服務器下載文件至本地 * * @param url 服務器IP地址 * @param port 服務器端口 * @param userName 用戶登錄名 * @param password 用戶登錄密碼 * @param remotePath 服務器文件存儲路徑 * @param fileName 服務器文件存儲名稱 * @param localPath 本地文件存儲路徑 * @return <b>true</b>:下載成功 * <br/> * <b>false</b>:下載失敗 */ public static boolean retrieveFile(String url, int port, String userName, String password, String remotePath, String fileName, String localPath) { boolean result = false; FTPClient ftp = new FTPClient(); OutputStream os = null; try { // 連接至服務器,端口默認為21時,可直接通過URL連接 ftp.connect(url, port); // 登錄服務器 ftp.login(userName, password); // 判斷返回碼是否合法 if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { // 不合法時斷開連接 ftp.disconnect(); // 結束程序 return result; } // 設置文件操作目錄 ftp.changeWorkingDirectory(remotePath); // 設置文件類型,二進制 ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 設置緩沖區大小 ftp.setBufferSize(3072); // 設置字符編碼 ftp.setControlEncoding("UTF-8"); // 構造本地文件對象 File localFile = new File(localPath + "/" + fileName); // 獲取文件操作目錄下所有文件名稱 String[] remoteNames = ftp.listNames(); // 循環比對文件名稱,判斷是否含有當前要下載的文件名 for (String remoteName : remoteNames) { if (fileName.equals(remoteName)) { result = true; } } // 文件名稱比對成功時,進入下載流程 if (result) { // 構造文件輸出流 os = new FileOutputStream(localFile); // 下載文件 result = ftp.retrieveFile(fileName, os); // 關閉輸出流 os.close(); } // 登出服務器 ftp.logout(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 判斷輸出流是否存在 if (null != os) { // 關閉輸出流 os.close(); } // 判斷連接是否存在 if (ftp.isConnected()) { // 斷開連接 ftp.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 從FTP服務器刪除文件 * * @param url 服務器IP地址 * @param port 服務器端口 * @param userName 用戶登錄名 * @param password 用戶登錄密碼 * @param remotePath 服務器文件存儲路徑 * @param fileName 服務器文件存儲名稱 * @return <b>true</b>:刪除成功 * <br/> * <b>false</b>:刪除失敗 */ public static boolean deleteFile(String url, int port, String userName, String password, String remotePath, String fileName) { boolean result = false; FTPClient ftp = new FTPClient(); try { // 連接至服務器,端口默認為21時,可直接通過URL連接 ftp.connect(url, port); // 登錄服務器 ftp.login(userName, password); // 判斷返回碼是否合法 if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { // 不合法時斷開連接 ftp.disconnect(); // 結束程序 return result; } // 設置文件操作目錄 ftp.changeWorkingDirectory(remotePath); // 設置文件類型,二進制 ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 設置緩沖區大小 ftp.setBufferSize(3072); // 設置字符編碼 ftp.setControlEncoding("UTF-8"); // 獲取文件操作目錄下所有文件名稱 String[] remoteNames = ftp.listNames(); // 循環比對文件名稱,判斷是否含有當前要下載的文件名 for (String remoteName : remoteNames) { if (fileName.equals(remoteName)) { result = true; } } // 文件名稱比對成功時,進入刪除流程 if (result) { // 刪除文件 result = ftp.deleteFile(fileName); } // 登出服務器 ftp.logout(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 判斷連接是否存在 if (ftp.isConnected()) { // 斷開連接 ftp.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return result; } public static void main(String[] args) throws FileNotFoundException { try { FileInputStream fis = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\太行后台socket發送工具1.txt")); System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", UUID.randomUUID() + ".txt", fis)); // File file = new File("D:\\upload\\20191217070411_start.txt"); // InputStream is = new FileInputStream(file); // System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt", is)); // System.out.println(retrieveFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt", "D:\\upload")); // System.out.println(deleteFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt")); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
上面的工具類定義了三個方法,分別支持上傳文件,下載文件,刪除FTP服務器上的文件,可根據需求自行調用;