寫在前面
FTP是一個檔案傳輸協議,被開發人員廣泛用於在網際網路中檔案傳輸的一套標準協議。
而我們通常在開發過程中也要透過FTP來搭建檔案系統,用於儲存系統檔案等。
目前正值SpringBoot熱潮,所以我們接下來會一起學習一下SpringBoot如何整合FTP,以及相關的FTP元件包,還有其主要提供的幾個方法。
當然在這系列文章結尾,我們還會給出確切的FTP操作工具類,算是一些小成果,希望和大家共勉。
FTP相關軟體安裝
我在此就不介紹如何安裝FTP了,但是我可以推薦給大家一些軟體作為選擇。
Linux版本,推薦使用vsftpd進行搭建FTP,只需要改指定的幾個配置,新增上使用者即可。
Windows版本,推薦使用Serv-U進行搭建FTP,圖形化介面,有中文版,操作起來很簡單。
開始整合
引入相關jar包
這裡我們對FTP相關的元件包使用的是edtFTPj,其實之前很多人都選擇的是Java自帶的包來實現FTP功能的。
在我們的SpringBoot專案中pom.xml下新增以下依賴。
<dependency>
<groupId>com.enterprisedt</groupId>
<artifactId>edtFTPj</artifactId>
<version>1.5.3</version>
</dependency>
複製程式碼
更新maven進行引入,然後我們進行下一步。
引入FTPUtils.java和FTPHelper.java
引入兩個工具類。
我這裡先貢獻一下程式碼,請大家酌情作為參考。
/**
* Ftp 工具類
*/
public class FtpHelper {
private FTPClient ftp;
public FtpHelper() {
}
/**
* 初始化Ftp資訊
*
* @param ftpServer ftp伺服器地址
* @param ftpPort Ftp埠號
* @param ftpUsername ftp 使用者名稱
* @param ftpPassword ftp 密碼
*/
public FtpHelper(String ftpServer, int ftpPort, String ftpUsername,
String ftpPassword) {
connect(ftpServer, ftpPort, ftpUsername, ftpPassword);
}
/**
* 連線到ftp
*
* @param ftpServer ftp伺服器地址
* @param ftpPort Ftp埠號
* @param ftpUsername ftp 使用者名稱
* @param ftpPassword ftp 密碼
*/
public void connect(String ftpServer, int ftpPort, String ftpUsername, String ftpPassword) {
ftp = new FTPClient();
try {
ftp.setControlEncoding("UTF-8");
ftp.setRemoteHost(ftpServer);
ftp.setRemotePort(ftpPort);
ftp.setTimeout(6000);
ftp.setConnectMode(FTPConnectMode.ACTIVE);
ftp.connect();
ftp.login(ftpUsername, ftpPassword);
ftp.setType(FTPTransferType.BINARY);
} catch (Exception e) {
e.printStackTrace();
ftp = null;
}
}
/**
* 更改ftp路徑
*
* @param ftp
* @param dirName
* @return
*/
public boolean checkDirectory(FTPClient ftp, String dirName) {
boolean flag;
try {
ftp.chdir(dirName);
flag = true;
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
return flag;
}
/**
* 斷開ftp連結
*/
public void disconnect() {
try {
if (ftp.connected()) {
ftp.quit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 讀取ftp檔案流
*
* @param filePath ftp檔案路徑
* @return s
* @throws Exception
*/
public InputStream downloadFile(String filePath) throws Exception {
InputStream inputStream = null;
String fileName = "";
filePath = StringUtils.removeStart(filePath, "/");
int len = filePath.lastIndexOf("/");
if (len == -1) {
if (filePath.length() > 0) {
fileName = filePath;
} else {
throw new Exception("沒有輸入檔案路徑");
}
} else {
fileName = filePath.substring(len + 1);
String type = filePath.substring(0, len);
String[] typeArray = type.split("/");
for (String s : typeArray) {
ftp.chdir(s);
}
}
byte[] data;
try {
data = ftp.get(fileName);
inputStream = new ByteArrayInputStream(data);
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
/**
* 上傳檔案到ftp
*
* @param file 檔案物件
* @param filePath 上傳的路徑
* @throws Exception
*/
public void uploadFile(File file, String filePath) throws Exception {
InputStream inStream = new FileInputStream(file);
uploadFile(inStream, filePath);
}
/**
* 上傳檔案到ftp
*
* @param inStream 上傳的檔案流
* @param filePath 上傳路徑
* @throws Exception
*/
public void uploadFile(InputStream inStream, String filePath)
throws Exception {
if (inStream == null) {
return;
}
String fileName = "";
filePath = StringUtils.removeStart(filePath, "/");
int len = filePath.lastIndexOf("/");
if (len == -1) {
if (filePath.length() > 0) {
fileName = filePath;
} else {
throw new Exception("沒有輸入檔案路徑");
}
} else {
fileName = filePath.substring(len + 1);
String type = filePath.substring(0, len);
String[] typeArray = type.split("/");
for (String s : typeArray) {
if (!checkDirectory(ftp, s)) {
ftp.mkdir(s);
}
}
}
ftp.put(inStream, fileName);
}
/**
* 刪除ftp檔案
*
* @param filePath 檔案路徑
* @throws Exception
*/
public void deleteFile(String filePath) throws Exception {
String fileName = "";
filePath = StringUtils.removeStart(filePath, "/");
int len = filePath.lastIndexOf("/");
if (len == -1) {
if (filePath.length() > 0) {
fileName = filePath;
} else {
throw new Exception("沒有輸入檔案路徑");
}
} else {
fileName = filePath.substring(len + 1);
String type = filePath.substring(0, len);
String[] typeArray = type.split("/");
for (String s : typeArray) {
if (checkDirectory(ftp, s)) {
ftp.chdir(s);
}
}
}
ftp.delete(fileName);
}
/**
* 切換目錄
*
* @param path
* @throws Exception
*/
public void changeDirectory(String path) {
if (!ValidateUtils.isEmpty(path)) {
try {
ftp.chdir(path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
複製程式碼
/**
* Ftp 工具類
*/
public class FtpHelper {
private FTPClient ftp;
public FtpHelper() {
}
/**
* 初始化Ftp資訊
*
* @param ftpServer ftp伺服器地址
* @param ftpPort Ftp埠號
* @param ftpUsername ftp 使用者名稱
* @param ftpPassword ftp 密碼
*/
public FtpHelper(String ftpServer, int ftpPort, String ftpUsername,
String ftpPassword) {
connect(ftpServer, ftpPort, ftpUsername, ftpPassword);
}
/**
* 連線到ftp
*
* @param ftpServer ftp伺服器地址
* @param ftpPort Ftp埠號
* @param ftpUsername ftp 使用者名稱
* @param ftpPassword ftp 密碼
*/
public void connect(String ftpServer, int ftpPort, String ftpUsername, String ftpPassword) {
ftp = new FTPClient();
try {
ftp.setControlEncoding("UTF-8");
ftp.setRemoteHost(ftpServer);
ftp.setRemotePort(ftpPort);
ftp.setTimeout(6000);
ftp.setConnectMode(FTPConnectMode.ACTIVE);
ftp.connect();
ftp.login(ftpUsername, ftpPassword);
ftp.setType(FTPTransferType.BINARY);
} catch (Exception e) {
e.printStackTrace();
ftp = null;
}
}
/**
* 更改ftp路徑
*
* @param ftp
* @param dirName
* @return
*/
public boolean checkDirectory(FTPClient ftp, String dirName) {
boolean flag;
try {
ftp.chdir(dirName);
flag = true;
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
return flag;
}
/**
* 斷開ftp連結
*/
public void disconnect() {
try {
if (ftp.connected()) {
ftp.quit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 讀取ftp檔案流
*
* @param filePath ftp檔案路徑
* @return s
* @throws Exception
*/
public InputStream downloadFile(String filePath) throws Exception {
InputStream inputStream = null;
String fileName = "";
filePath = StringUtils.removeStart(filePath, "/");
int len = filePath.lastIndexOf("/");
if (len == -1) {
if (filePath.length() > 0) {
fileName = filePath;
} else {
throw new Exception("沒有輸入檔案路徑");
}
} else {
fileName = filePath.substring(len + 1);
String type = filePath.substring(0, len);
String[] typeArray = type.split("/");
for (String s : typeArray) {
ftp.chdir(s);
}
}
byte[] data;
try {
data = ftp.get(fileName);
inputStream = new ByteArrayInputStream(data);
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
/**
* 上傳檔案到ftp
*
* @param file 檔案物件
* @param filePath 上傳的路徑
* @throws Exception
*/
public void uploadFile(File file, String filePath) throws Exception {
InputStream inStream = new FileInputStream(file);
uploadFile(inStream, filePath);
}
/**
* 上傳檔案到ftp
*
* @param inStream 上傳的檔案流
* @param filePath 上傳路徑
* @throws Exception
*/
public void uploadFile(InputStream inStream, String filePath)
throws Exception {
if (inStream == null) {
return;
}
String fileName = "";
filePath = StringUtils.removeStart(filePath, "/");
int len = filePath.lastIndexOf("/");
if (len == -1) {
if (filePath.length() > 0) {
fileName = filePath;
} else {
throw new Exception("沒有輸入檔案路徑");
}
} else {
fileName = filePath.substring(len + 1);
String type = filePath.substring(0, len);
String[] typeArray = type.split("/");
for (String s : typeArray) {
if (!checkDirectory(ftp, s)) {
ftp.mkdir(s);
}
}
}
ftp.put(inStream, fileName);
}
/**
* 刪除ftp檔案
*
* @param filePath 檔案路徑
* @throws Exception
*/
public void deleteFile(String filePath) throws Exception {
String fileName = "";
filePath = StringUtils.removeStart(filePath, "/");
int len = filePath.lastIndexOf("/");
if (len == -1) {
if (filePath.length() > 0) {
fileName = filePath;
} else {
throw new Exception("沒有輸入檔案路徑");
}
} else {
fileName = filePath.substring(len + 1);
String type = filePath.substring(0, len);
String[] typeArray = type.split("/");
for (String s : typeArray) {
if (checkDirectory(ftp, s)) {
ftp.chdir(s);
}
}
}
ftp.delete(fileName);
}
/**
* 切換目錄
*
* @param path
* @throws Exception
*/
public void changeDirectory(String path) {
if (!ValidateUtils.isEmpty(path)) {
try {
ftp.chdir(path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
複製程式碼
如何使用
public static void main(String[] args) {
try {
// 從ftp下載檔案
FtpHelper ftp = new FtpHelper("127.0.0.1", 21, "root", "123456");
File file = new File("D:\1.doc");
ftp.uploadFile(file, "test/weradsfad2.doc");
ftp.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
作者:Ijiran
連結:https://juejin.cn/post/7022817255779991589
來源:稀土掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。